我正在使用Django Rest Framework(DRF)构建API,并通过社交应用程序启用身份验证/注册。
为了通过他们的社交帐户验证用户,我使用Django休息框架Social Oauth2,它就像一个魅力。为了确保我的用户已登录,我在我的应用程序的views.py中创建了一个非常简单的视图:
def index(request):
return HttpResponse("is_anonymous: %s" % request.user.is_anonymous)
浏览器中的结果如下(表示用户已登录):
is_anonymous:False
现在,当我使用DRF构建API时,我可能需要在我的一个视图集中检索当前用户的一些数据(来自request.user),但是在以下代码中,结果不是我的预期:
class HelloViewSet(viewsets.ModelViewSet):
queryset = Hello.objects.all()
serializer_class = HelloSerializer
# This is just a random ViewSet, what is
# important is the custom view below
@action(detail=False)
def test(self, request):
return Response(request.user.is_anonymous)
此处结果显示用户未登录:
真
因此第一个视图显示request.user.is_anonymous = False,第二个视图显示request.user.is_anonymous = True。两个视图都位于同一个应用程序中的views.py文件中。
我在这里想念什么?我们不应该在API REST中获取用户实例吗?
答案 0 :(得分:1)
我想这是因为你的第一个观点是纯粹的Django而且它没有使用DRF的DEFAULT_AUTHENTICATION_CLASSES
。要启用它,您可以添加@api_view
装饰器:
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view()
def index(request):
return Response("is_anonymous: %s" % request.user.is_anonymous)
此外,您应该更新DEFAULT_AUTHENTICATION_CLASSES
以启用OAuth,如下所示:
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
...
'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
'rest_framework_social_oauth2.authentication.SocialAuthentication',
),
}
答案 1 :(得分:1)
As neverwalkaloner mentioned in the in the comments,问题是我没有通过Authorization: Bearer <token>
传递标题中的任何access_token,所以当然服务器无法识别&#34;登录&#34;正在发出请求的用户。使用curl(或Postman)我可以添加此标记以用于检查目的并且它有效。