关于python:Django rest-framework在两次调用之间不存储经过身份验证的用户

Django rest-framework does not store authenticated user between calls

对于我目前正在从事的项目,我决定编写一个自定义身份验证模型。我正在使用其余框架和全部访问权限。本地身份验证尚未实现(它是,但是版本不同,因此没有问题)。

用户模型正确注册,OAuth身份验证有效。用户可以正常登录。

使用视图时,如果我使用django的View作为基类,则身份验证可以正常工作。如果我使用rest-framework的APIView,则不会太多。

在我的ProfileView中(这里是LOGIN_REDIRECT_URL重定向),我收到一个rest_framework.request.Request实例,我认为可以。问题是:

request.user是AnonymousUser的实例(即使登录后也是如此)

我想问题可能出在我的实现上,但是然后:

request._request.user是经过身份验证的用户

(请注意request._request是原始的Django请求)

我倾向于认为这是一个其余的框架错误,但也许你们当中的一个知道解决方法?

编辑
仅需注意,登录是在非APIView类中进行的,而是在从View继承的类中进行的。这可能是User实例未传递到APIView实例的原因。


您需要在settings.py中设置DEFAULT_AUTHENTICATION_CLASSES。其他DRF将默认设置为None作为request.authAnonymousUser作为request.user

1
2
3
4
5
6
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}

设置好该值并且用户登录后,请确保请求标头中的session_id可用。浏览器通常存储会话信息,并将其传递到所有请求的标头中。

如果您使用的是非浏览器客户端(例如,移动应用程序),则需要在标头中手动设置会话ID。

此外,由于您提到使用oauth登录用户,因此对于oauth2,您需要指定oauth2授权标头,而不是会话ID。

1
"Authorization: Bearer <your-access-token>"

请参阅Django Rest Framework中的身份验证