3

現在、django を使用してアプリを開発していますが、ビューまたはテンプレートをレンダリングするときにエラーが発生するたびに、セッションがログアウトされます。これはかなり面倒なことになります。この「機能」を無効にするにはどうすればよいですか? ビュー内でエラーが発生した場合にのみ、コードのロード/解析時にエラーが発生した場合 (ビューのデコレーターが失敗した場合など) は、ログアウトされないことに注意してください。

編集:私はちょうどテストしましたが、はい、raise Exceptionビューでこれを引き起こします。

私のビューはすべてデコレータでラップされています。これは、とりわけ次のことを行います。

def needs_base_index_dict(func):
    def wrapper(request, *args, **kwargs):
        request.session.set_expiry(30*60)
        #...

行をコメントアウトすると、set_expiryこの動作は得られません。エラーを修正しても、ログインしたままです。その行がコメントアウトされていない場合、ビュー内のすべてのエラー (以下を含むraise Exception()) がセッションをログアウトします。

4

3 に答える 3

4

Django は基本的に、変更があるたびにセッションをデータベースに書き込みます。ビュー デコレータでセッション状態を更新しているため、これは DB へのセッション書き込みが必要であることを意味します。

ただし、トランザクション管理を備えたデータベースを使用している場合、ビューが失敗すると、データベースの書き込みがロールバックされます。ただし、セッション Cookie の有効期限はブラウザで更新されています。これは、ブラウザ セッションとサーバーに保存されているセッションが一致しなくなったことを意味します。この不一致により、セッションがドロップされ、ログアウトされます。

これは、その行をコメントアウトすると問題なく動作する理由も説明しています。

django dev サーバーを使用している場合は、コンソールでクエリを確認できるはずです。エラーが発生したときに、セッション更新クエリが正常に実行されているかどうかを確認します。そうでない場合は、ログアウトしている理由がわかります:)

これは望ましい動作ですが、デバッグ環境で無効にしたい場合は、デコレータの関連する行の上に DEBUG のチェックを追加してください。または、トランザクション管理を無効にすることもできます (推奨されません)。

于 2012-07-13T06:27:28.137 に答える
3

理由に対する答えではありませんが、おそらく回避策は次のとおりです。

def needs_base_index_dict(func):
    def wrapper(request, *args, **kwargs):
        #... do the work
        func(*args, **kwargs)
        #... then set the expiry
        request.session.set_expiry(30*60)
于 2012-07-11T07:13:41.383 に答える
0

コメントで、エラー ページでも set-cookie ヘッダーを取得すると述べています。セッション オブジェクトは問題ないように見えますか? セッションのドキュメントでは、他のデータベース オブジェクトと同じように、db ベースのセッションにアクセスできると書かれています。

from django.contrib.sessions.models import Session
s = Session.objects.get(pk='2b1189a188b44ad18c35e113ac6ceead')

そのセッションが匿名ユーザー向けである場合、私はこれを非常に興味深い機能と呼んでいます。完全に有効なセッションであるにもかかわらず、ログインしていないように見える場合は、セッション cookie の処理にバグがあります。

于 2012-07-10T07:31:29.780 に答える