Django, request.user is always Anonymous User

后端 未结 9 2104
无人共我
无人共我 2020-12-01 14:57

I am using a custom authentication backend for Django (which runs off couchdb). I have a custom user model.

As part of the login, I am doing a request.user = u

9条回答
  •  没有蜡笔的小新
    2020-12-01 15:26

    The request.user is set by the django.contrib.auth.middleware.AuthenticationMiddleware.

    Check django/contrib/auth/middleware.py:

    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
    

    Then look at the get_user function in django/contrib/auth/__init__.py:

    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
    

    Your backend will need to implement the get_user function.

提交回复
热议问题