ユーザーがログインしているかどうかにかかわらず、Cookieを設定したい。
私のミドルウェア:
class UserStatus(object):
def process_response(self,request,response):
user_status = 1 if request.user.is_authenticated() else 0
max_age = (20)*52*7*24*60*60 # 20 years (After expiry, cookie gets deleted)
response.set_cookie(user_status_cookie,user_status,max_age)
return response
に追加 MIDDLEWARE_CLASSES
最後にsettings.pyで。
問題:
FineManualによると:
応答フェーズ(process_response()およびprocess_exception()ミドルウェア)の間、クラスは下から上に逆の順序で適用されます
したがって、ミドルウェアを追加した方がよいと思いますbefore認証ミドルウェアとセッションミドルウェア(応答のみを処理する場合)。
これが言われている、私はあなたがいくつかのページでのみエラーを持っているという事実に少し困惑しています???
最近同じ問題に遭遇し、末尾のスラッシュなしでURLにアクセスしていて、APPEND_SLASH設定がtrueに設定されているときに発生することがわかりました。
Djangoが最初のリクエストを処理する
Djangoは、スラッシュを付けてURLのリクエストを処理します
永続的なリダイレクトの後で、いくつかの主な属性(ユーザーとセッション)がprocess_responseでアクセスできない理由を誰かが知っていますか?
つまり、Django Common Middlewareによるリダイレクトを介して_APPEND_SLASH
_が適用され、AuthenticationMiddleware
(user
属性を追加)のprocess_request()
が実行されないようにする必要がありますが、_process_response
_まだ実行中です。
Djangoプロセスミドルウェアが実際に機能する方法を次に示します(Django 1.6の_Django/core/handlers/base.py
_から)
yourdomain.com/view
_です。これにより、ミドルウェアフローが開始されます。CommonMiddleware
に到達すると、ミドルウェアはスラッシュがないことを確認し、http.HttpResponsePermanentRedirect(newurl)
を返します。これにより、AuthenticationMiddleware
属性をuser
に追加するrequest
の1つを含め、追加の_process_requests
_の実行が直ちに停止されますCommonMiddleware
が例外(_Http404
_を含む)を返さなかったため、Django
はミドルウェアから応答を受け取り、_MIDDLEWARE_CLASSES
_にリストされているすべてのミドルウェアのEVERY process_response()
を介して実行します。そのミドルウェアのprocess_request()
を実行する機会があった場合。これを修正する唯一の実際の方法は、_MIDDLEWARE_CLASSES
_のAuthenticationMiddleware
の後にあるprocess_request()
メソッドにコードを移動するか、request
オブジェクトにuser
属性があるかどうかをhasattr()
を介して検出することです。
このミドルウェアはアクティブですか?:
'Django.contrib.auth.middleware.AuthenticationMiddleware'
そして、このミドルウェアはミドルウェアの前に実行されますか?
同様の問題があり、一部のページではリクエストにユーザーが含まれていないため、ミドルウェアでは簡単なチェックを行います
if not hasattr(request, 'user'):
return response
DjangoのAuthenticationMiddleware(リクエストオブジェクトへの.userの割り当てを担当する)の前に実行されるミドルウェアまたはその他のコード内で例外が発生する可能性があります。
次に、.user変数にアクセスするとAttributeErrorが発生します。
たとえば、AuthenticationMiddlewareを実行する前に例外がトリガーされると、エラービューが実行される可能性があります。エラービューがrequest.userに依存している場合、質問のタイトルに記載されているエラーが表示されます。