Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 为什么请求对象在一个;本地的;视图和模型视图集?_Django_Django Rest Framework - Fatal编程技术网

Django 为什么请求对象在一个;本地的;视图和模型视图集?

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) 浏览

我正在使用Django Rest框架(DRF)构建一个API,并通过社交应用程序启用身份验证/注册

为了通过用户的社交帐户对其进行身份验证,我使用Django rest框架social Oauth2,它的工作方式很有魅力。为了确保我的用户已登录,我在我的应用程序的views.py中创建了一个非常简单的视图:

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,但实际上并不知道它是如何工作的,显然迟早我会遇到理解不足的问题。授权中传递的这个令牌确实是我在寻找的!