2

'app' というアプリを使用したバニラ django プロジェクトがあります。これには、views.py と middleweres.py があります。

#views.py
from django.http.response import HttpResponse

def home(request):
    return HttpResponse('')

#settings.py

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'app.middlewares.M',
)

#middlewares.py
class M(object):
    def process_request(self, request):
        request.session['a']='a'

Django は、リクエストごとに db のセッション テーブルに行を追加します。なんで?

UPD: 私はまだ混乱しています。その質問のために github プロジェクトを作成しました: https://github.com/vinograd19/django-session-problem/ ここで私のコードを見つけて、自分のマシンで実行できます

4

2 に答える 2

4

カスタム ミドルウェア M は、リクエストごとにセッション ディクショナリを変更しています (独自のミドルウェアの作成)。

process_request() は、Django が実行するビューを決定する前に、リクエストごとに呼び出されます。

リクエストごとにセッションを変更している場合でも、すべてのユーザー (同じブラウザーの同じ訪問者) に対して 1 つの行のみが必要です。同じ訪問者が複数のリクエストを行う場合、対応するセッション行はリクエストごとに更新する必要があります (ミドルウェア「M」のため)。同じ訪問者に対して追加の行が作成されることはありませんが、新しい訪問者が Web サイトにアクセスすると、新しい行が作成されます。Django ドキュメントから:

データベースのバックエンドで何が起こるかを考えてください。ユーザーがログインすると、Django は django_session データベース テーブルに行を追加します。Django は、セッション データが変更されるたびにこの行を更新します。ユーザーが手動でログアウトすると、Django は行を削除します。ただし、ユーザーがログアウトしない場合、行は削除されません。同様のプロセスがファイル バックエンドでも発生します。

DB セッションテーブルに多くの行が見つかった場合は、パージする必要がある期限切れのセッションがある可能性があります (セッション ストアのクリア) 。

Django は、期限切れのセッションの自動パージを提供しません。したがって、期限切れのセッションを定期的にパージするのはあなたの仕事です。Django は、この目的のためにクリーンアップ管理コマンド clearsessions を提供しています。このコマンドは、毎日の cron ジョブなど、定期的に呼び出すことをお勧めします。

この場合、clearsessions コマンドを呼び出す必要があります。

django-admin.py clearsessions

このコマンドを定期的に呼び出して期限切れのセッションを消去するように cron ジョブをセットアップする必要があります。

于 2013-03-27T11:59:24.540 に答える
1

ドキュメントから:

セッションの保存時

デフォルトでは、Django はセッションが変更された場合 (つまり、辞書の値のいずれかが割り当てられているか削除されている場合) にのみセッション データベースに保存します。

于 2013-03-18T16:42:26.637 に答える