Django,request.user始终是匿名用户

Sha*_*bie 10 django

我正在使用Django的自定义身份验证后端(运行couchdb).我有一个自定义用户模型.

作为登录的一部分,我正在做一个request.user = user并在会话中保存用户ID.但是,在后续请求中,我无法检索request.user.它始终是AnonymousUser.但是,我可以从会话中检索用户ID,并确认正确设置了会话cookie.

我错过了什么?

我不想使用关系数据库,因为我想在couchdb中维护我的所有用户数据.

编辑:我写了一个不从Django的auth用户继承的类.但它具有用户名和电子邮件属性.出于这个原因,我的后端不会返回一个派生自auth User的类.

dge*_*gel 13

由... request.user设定django.contrib.auth.middleware.AuthenticationMiddleware.

检查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
Run Code Online (Sandbox Code Playgroud)

然后看看get_user函数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
Run Code Online (Sandbox Code Playgroud)

您的后端需要实现该get_user功能.


yen*_*sun 5

我也有自定义身份验证后端,并且总是AnonymousUser成功进行身份验证和登录后得到。我get_user在后端有方法。我所缺少的是get_user必须只吸引用户pk,而不是通过电子邮件或您使用的任何凭据authenticate

class AccountAuthBackend(object):

@staticmethod
def authenticate(email=None, password=None):
    try:
        user = User.objects.get(email=email)
        if user.check_password(password):
            return user
    except User.DoesNotExist:
        return None

@staticmethod
def get_user(id_):
    try:
        return User.objects.get(pk=id_) # <-- tried to get by email here
    except User.DoesNotExist:
        return None
Run Code Online (Sandbox Code Playgroud)

很容易在文档中错过这一行:

get_user方法采用一个user_id(可以是用户名,数据库ID或其他名称,但必须是User对象的主键),并返回User对象。

碰巧这email不是我的架构中的主键。希望这可以节省一些时间。


Bjö*_*ist 3

请详细说明。如果您使用自定义用户模型(与自定义用户配置文件模型不同),那么您基本上只能靠自己,django.contrib.auth 框架无法帮助您进行身份验证。如果您正在编写自己的身份验证系统并且没有使用 django.contrib.auth,那么您需要将其关闭,因为它似乎会干扰您的系统。