に関してAuthenticationMiddleware
、なぜ Django 1.3user
はクラス レベルでプロパティを処理したのですか? また、なぜ 1.4 でインスタンス プロパティに変更されたのですか?
これは1.3から
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
class AuthenticationMiddleware(object):
def process_request(self, request):
request.__class__.user = LazyUser()
return None
そしてこれは1.4から
def get_user(request):
if not hasattr(request, '_cached_user'):
request._cached_user = auth.get_user(request)
return request._cached_user
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.user = SimpleLazyObject(lambda: get_user(request))
# SimpleLazyObject inherits from LazyObject
1.3 では、クラス レベル属性にprocess_request
割り当てられることを理解しました。これは、基本的に次の 2 つのことを意味します。LazyUser()
user
HttpRequest
クラス ( )は2 つの要求の間でrequest.__class__
その属性を保存したため、将来のオブジェクトはそれにアクセスできました。user
request
- ビュー関数が にアクセスしようとするたび
request.user
に、LazyUser
オブジェクトの__get__
メソッドがトリガーされ、リクエストのキャッシュまたは認証ストレージからユーザー オブジェクトが返されました。
私はそれについて正しいですか?
また、1.4 で次の 2 つの大きな変更点があることに気付きました。
SimpleLazyObject
クラスではなく に割り当てられrequest
ます (つまり、インスタンス プロパティです)。LazyObject
SimpleLazyObject
独自の__get__
メソッドを定義 (カスタマイズ) しないでください。
このように、いつget_user
トリガーされますか?2 つのリクエスト間で request.user を保存し、Http のステートレス性をオーバーライドする
方法は?AuthenticationMiddleware