0

ジャンゴの場合:

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

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):
    assert hasattr(request, 'session'), "The Django authentication ..."
    request.__class__.user = LazyUser()
    return None

ご覧のとおり、LazyUser() はリクエストのクラスの属性です_cached_userが、インスタンスの属性です。request

request.__class__.user = LazyUser()

違いはなぜですか?LazyUser基本的に、存在するかどうかを確認し、存在しない場合はバックエンドにユーザーを_cached_user照会します。sessionその場合、両方ともインスタンスの属性であるべきではありませLazyUser_cached_userrequest

4

1 に答える 1

0
request.__class__.user = LazyUser()

これは、ビューとテンプレートでログインしたユーザーインスタンスを使用でき、そのデータを保持するのに最適な場所はリクエストです...

一方、_cached_userはdjangoの内部関数です。つまり、この関数はdjango内で使用され、djangoを使用するすべての人が使用するにはaviodである必要があります。したがって、これをクラス属性として追加しないのは論理的です... django開発者が言ったように、「_」で始まる属性は、djangoで使用されるように記述されているため、djangoで記述されたアプリケーションではなく、使用してはなりません。

また、_cached_userはリクエストをチェックし、場合によっては、ログインしたユーザーのリクエストデータにその情報が含まれていない可能性があります(ブラウザのキャッシュなど)。LazyUserは、すべての条件でログインしたユーザーのユーザーインスタンスを返すことを保証します。

また、Djangoは、リクエストに関連付けられた認証済みユーザーが各Webリクエストの処理中に変更されないことを前提としています。

于 2011-05-10T07:15:11.327 に答える