21

django_sessionおそらくこれは完全に正常な動作ですが、テーブルが必要以上に大きいように感じます。

まず、次のクリーンアップ コマンドを毎日実行して、セッションの期限切れがサイズの原因にならないようにします。

DELETE FROM %s WHERE expire_date < NOW()

数字:

  • 毎日約 5000 のユニークな訪問者 (ボットを除く) がいます。
  • SESSION_COOKIE_AGEデフォルトの 2 週間に設定されています
  • テーブルには1,000,000を少し超える行があります

したがって、Django はサイトにアクセスするすべてのボットのセッション キーも生成し、ボットは Cookie を保存しないため、継続的に新しい Cookie を生成すると推測しています。

でも・・・これは正常な動作でしょうか?Django が匿名ユーザーのセッションを生成しない、または少なくとも...セッションを使用していないユーザーのセッションを生成しないようにする設定はありますか?

4

4 に答える 4

17

少しデバッグした後、問題の原因を追跡することができました。私のミドルウェアの1つ(および私の見解のほとんど)には、が含まrequest.user.is_authenticated()れています。

django.contrib.authミドルウェアrequest.userは_LazyUser()

出典:http ://code.djangoproject.com/browser/django/trunk/django/contrib/auth/middleware.py?rev = 14919#L13 (なぜそこにあるのかわかりませんが、わかりましたreturn None... )。

class AuthenticationMiddleware(object):
    def process_request(self, request):
        assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."
        request.__class__.user = LazyUser()
        return None

ユーザーを取得するためのLazyUser呼び出し:get_user(request)

ソース:http ://code.djangoproject.com/browser/django/trunk/django/contrib/auth/middleware.py?rev = 14919#L5

class LazyUser(object):
    def __get__(self, request, obj_type=None):
        if not hasattr(request, '_cached_user'):
            from django.contrib.auth import get_user
            request._cached_user = get_user(request)
       return request._cached_user

get_user(request)メソッドはuser_id = request.session[SESSION_KEY]

ソース:http ://code.djangoproject.com/browser/django/trunk/django/contrib/auth/ init .py?rev = 14919#L100

def get_user(request):
    from django.contrib.auth.models import AnonymousUser
    try:
        user_id = request.session[SESSION_KEY]
        backend_path = request.session[BACKEND_SESSION_KEY]
        backend = load_backend(backend_path)
        user = backend.get_user(user_id) or AnonymousUser()
    except KeyError:
        user = AnonymousUser()
    return user

セッションにアクセスすると、 accessedtrueに設定されます。

ソース:http ://code.djangoproject.com/browser/django/trunk/django/contrib/sessions/backends/base.py?rev = 14919#L183

def _get_session(self, no_load=False):
    """
    Lazily loads session from storage (unless "no_load" is True, when only
    an empty dict is stored) and stores it in the current instance.
    """
    self.accessed = True
    try:
        return self._session_cache
    except AttributeError:
        if self._session_key is None or no_load:
            self._session_cache = {}
        else:
            self._session_cache = self.load()
    return self._session_cache

そして、それによりセッションが初期化されます。このバグは、がtrueに設定されている場合にもセッションを生成する障害のあるセッションバックエンドが原因で発生しましたaccessed...

于 2010-12-16T01:33:00.420 に答える
3

ロボットは、ユーザー セッションで何かを設定したページ (匿名ユーザーの場合も含む)、または使用するページsession.set_test_cookie()(たとえば、このメソッドを呼び出す Django のデフォルトのログイン ビュー) にアクセスできますか? どちらの場合も、新しいセッション オブジェクトが作成されます。robots.txt でそのような URL を除外すると役立つはずです。

于 2010-12-15T08:46:19.577 に答える
0

私の場合、正確な意味を理解せず に誤って設定SESSION_SAVE_EVERY_REQUEST = Trueしました。settings.py

次に、django サービスへのすべてのリクエスト、特にアップストリーム ロード バランサーからのハートビート テスト リクエストで、セッション エントリが生成されます。数日間のランニングの後、django_sessionテーブルは巨大なものに変わりました。

于 2015-03-25T07:29:11.920 に答える
-3

Django は、これらの期限切れのセッションをクリーンアップするための管理コマンドを提供しています!

于 2010-12-15T02:35:51.580 に答える