Django rest-framework不会在调用之间存储经过身份验证的用户

时间:2013-04-28 04:58:42

标签: python django django-rest-framework

对于我目前正在进行的项目,我决定编写一个自定义身份验证模型。我正在使用rest-framework和all-access。本地身份验证尚未实现(它是,但在不同的版本中,所以没有问题)。

用户模型正确注册并且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实例的原因。

1 个答案:

答案 0 :(得分:2)

您需要在DEFAULT_AUTHENTICATION_CLASSES中设置settings.py。其他DRF默认为Nonerequest.authAnonymousUserrequest.user

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    )
}

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

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

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

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

请参阅Django Rest Framework

中的身份验证