Django 为什么请求对象在一个;本地的;视图和模型视图集?
我正在使用Django Rest框架(DRF)构建一个API,并通过社交应用程序启用身份验证/注册 为了通过用户的社交帐户对其进行身份验证,我使用Django rest框架social Oauth2,它的工作方式很有魅力。为了确保我的用户已登录,我在我的应用程序的views.py中创建了一个非常简单的视图:Django 为什么请求对象在一个;本地的;视图和模型视图集?,django,django-rest-framework,Django,Django Rest Framework,我正在使用Django Rest框架(DRF)构建一个API,并通过社交应用程序启用身份验证/注册 为了通过用户的社交帐户对其进行身份验证,我使用Django rest框架social Oauth2,它的工作方式很有魅力。为了确保我的用户已登录,我在我的应用程序的views.py中创建了一个非常简单的视图: def index(request): return HttpResponse("is_anonymous: %s" % request.user.is_anonymous) 浏览
def index(request):
return HttpResponse("is_anonymous: %s" % request.user.is_anonymous)
浏览器中的结果如下(表示用户已登录):
你是匿名的吗
现在,当我使用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中获取用户实例?我想这是因为您的第一个视图是纯Django,它没有使用DRF的
默认身份验证类。要启用它,您可以添加@api\u 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\u AUTHENTICATION\u CLASSES
以启用OAuth,如下所示:
REST_FRAMEWORK = {
...
'DEFAULT_AUTHENTICATION_CLASSES': (
...
'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
'rest_framework_social_oauth2.authentication.SocialAuthentication',
),
}
,问题是我没有通过Authorization:Bearer
在标头中传递任何访问令牌,因此服务器当然无法识别发出请求的“已登录”用户。使用curl(或Postman),我可以添加此令牌以用于检查目的,它起了作用。正如您所猜测的,两个视图之间使用的身份验证系统似乎不同,现在两个视图都为“request.user.is\u anonymous”发送True。但这仍然意味着,如果用户的视图不在“纯django视图”范围内,我就无法访问登录用户的数据,因为他被认为是匿名的(注:我使用facebook登录)。有没有办法让登录操作使用上面给出的默认身份验证类?(我不知道这是否是问题所在,我只是觉得我的登录没有使用正确的身份验证类)@SugarMouse你提供了Authorization:Bearer
头吗?我没有,这是强制性的吗?我该怎么得到这个代币?上次我检索用户的令牌是通过使用/auth/token-route,但我必须添加用户名和密码数据作为参数,但“社交用户”没有password@SugarMouse没有此令牌,DRF无法对用户进行身份验证。您需要将社交令牌转换为访问令牌。查看django rest social auth文档,以澄清为什么要这么做。我试图使用OAuth 2.0,但实际上并不知道它是如何工作的,显然迟早我会遇到理解不足的问题。授权中传递的这个令牌确实是我在寻找的!