2

django を使用して、基本的なログインおよびログアウト ページを実装しています。私のログイン関数は、db の django_session テーブルに行を追加します。ただし、ログアウトしても、セッション行は削除されません。セッションはもはや有効ではなく、すべてのセッション関連データがリクエストから削除されているため、ログアウト関数もセッション行を django_session テーブルから削除すべきではありませんか?

ここに私のログアウト機能があります:

@login_required
def logout_student(request):
    logout(request)
    # Redirect to a success page.
    return HttpResponseRedirect('/index/')

ご協力いただきありがとうございます。

4

3 に答える 3

4

django_sessionログイン時に に手動で行を追加するdjango.contrib.auth.logout()と、request.session.flush()) 関数は現在のセッション キーと同じ主キーを持つ行のみをテーブルから削除します。session_keydjango_session

request.session.flush()ユーザーのブラウザから以前のセッション データに再度アクセスできないようにするために使用されます。基本的に次の 2 つのことを行います。

  1. 現在のセッション データをデータベース (またはキャッシュ、セッション バックエンド用に選択したものによって異なります) から削除します。
  2. Cookie でユーザーに送り返されるセッション キーの値を再生成します。

の Django ソース コードdjango.contrib.auth.logout():

def logout(request):
    """
    Removes the authenticated user's ID from the request and flushes their
    session data.
    """
    # Dispatch the signal before the user is logged out so the receivers have a
    # chance to find out *who* logged out.
    user = getattr(request, 'user', None)
    if hasattr(user, 'is_authenticated') and not user.is_authenticated():
        user = None
    user_logged_out.send(sender=user.__class__, request=request, user=user)

    request.session.flush()
    if hasattr(request, 'user'):
        from django.contrib.auth.models import AnonymousUser
        request.user = AnonymousUser()

データベースベースのセッションの削除方法:

def delete(self, session_key=None):
    if session_key is None:
        if self.session_key is None:
            return
        session_key = self.session_key
    try:
        Session.objects.get(session_key=session_key).delete()
    except Session.DoesNotExist:
        pass

手動で追加した行を削除するには、Django シグナルdjango.contrib.auth.signals.user_logged_outを利用して、ユーザーのログアウト時に行を削除します。

于 2012-09-25T00:55:14.000 に答える
3

セッション行は削除されないため、後でセッションを監査できます。(たとえば) カスタム管理コマンドと cron を使用して、行を手動でクリーンアップする必要があります。

于 2012-09-24T23:47:52.903 に答える
0
  • ユーザーのログアウト時に、セッションは削除も無効化もされません。セッション データ (ユーザー設定言語など) は引き続きリクエストで利用可能
  • セッションは期限切れまたは削除された場合にのみ無効になります (自動または手動)
  • 期限切れのセッションをクリーンアップするには、. /manage.py cleanupを実行します

データベース レベルでセッションを操作するのは本当に奇妙です。ログアウト時にセッションを削除または無効にするのは意味がありません。また、Django 汎用ログアウト ビューまたはdjango-registrationを使用し、シグナルでカスタム ロジック (存在する場合) を処理することをお勧めします。

于 2012-09-25T00:48:39.917 に答える