Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.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
Javascript Django Rest框架在我通过ajax调用当前经过身份验证的用户时将其替换为匿名用户?_Javascript_Python_Django_Django Rest Framework - Fatal编程技术网

Javascript Django Rest框架在我通过ajax调用当前经过身份验证的用户时将其替换为匿名用户?

Javascript Django Rest框架在我通过ajax调用当前经过身份验证的用户时将其替换为匿名用户?,javascript,python,django,django-rest-framework,Javascript,Python,Django,Django Rest Framework,我正试图通过一个简单的RESTfulAPI和Javascript向Django管理页面添加一些交互式内容。应该很简单,但我面临一个奇怪的问题,来自javascript的每一个请求都返回一个403授权错误。注意,这只适用于js。我可以在浏览器中点击url,然后做所有基本的CRUD工作 代码非常基本 Javascript $.ajax({ xhrFields: {withCredentials: true}, type: 'PATCH', url: 'path/to/my/e

我正试图通过一个简单的RESTfulAPI和Javascript向Django管理页面添加一些交互式内容。应该很简单,但我面临一个奇怪的问题,来自javascript的每一个请求都返回一个
403
授权错误。注意,这只适用于js。我可以在浏览器中点击url,然后做所有基本的CRUD工作

代码非常基本

Javascript

$.ajax({
    xhrFields: {withCredentials: true},
    type: 'PATCH',
    url: 'path/to/my/endpoint,
    data: {
        aParam: someValue,
        'csrfmiddlewaretoken': getCookie('csrftoken')
    },
    success: doSomething,
    error: doSomething
});
class MyObjectDetail(RetrieveUpdateDestroyAPIView):
  queryset = MyObject.objects.all()
  serializer_class = MyObjectSerializer

  authentication_classes = (SessionAuthentication,)
  permission_classes = (IsAuthenticated,)
Python

$.ajax({
    xhrFields: {withCredentials: true},
    type: 'PATCH',
    url: 'path/to/my/endpoint,
    data: {
        aParam: someValue,
        'csrfmiddlewaretoken': getCookie('csrftoken')
    },
    success: doSomething,
    error: doSomething
});
class MyObjectDetail(RetrieveUpdateDestroyAPIView):
  queryset = MyObject.objects.all()
  serializer_class = MyObjectSerializer

  authentication_classes = (SessionAuthentication,)
  permission_classes = (IsAuthenticated,)
我最初怀疑会话ID没有被发送,因此这就是为什么由于权限问题,一切都失败了。然而,会话cookie确实是在ajax POST中发送的,并由Django中间件获取。Django毫无问题地完成了我的管理会话。但是,(经过大量调试后)我跟踪了用户重写到Django Rest框架中的
分派
方法——具体地说,是调用
self.initialize\u请求
。在该调用返回后,我的管理员用户将被替换为rest框架的一个
AnonymouseUser
s


我完全迷路了。我花了大约2个小时逐步调试,但仍然不明白为什么我的用户被调出。以前有人面对过这种情况吗?我只是做错了什么吗

403错误的主体应该包括一条友好的消息,解释问题所在,我认为在这种情况下,您会发现该消息抱怨缺少CSRF令牌

注意,这只适用于js。我可以在浏览器中点击url,然后做所有基本的CRUD工作

JS和浏览器之间只有几点不同,没有一点是由Django REST框架直接导致的。您可能遇到的问题是AJAX请求中如何处理CSRF:。现在这意味着将JavaScript更改为

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

function addCsrfToken (xhr, settings) {
    if (!csrfSafeMethod(settings.type)) {
        xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
}

$.ajax({
    xhrFields: {withCredentials: true},
    type: 'PATCH',
    url: 'path/to/my/endpoint',
    data: {
        aParam: someValue
    },
    success: doSomething,
    error: doSomething,
    beforeSend: addCsrfToken
});
请注意,虽然建议全局设置此标头,但它明确禁止在跨源请求中发送令牌。在代码中(从带有凭据的
)可以看出,您正在访问不同域上的API

Django毫无问题地完成了我的管理会话

这很可能是因为在浏览器中点击页面不会触发CSRF检查,可浏览API会为您处理CSRF

在该调用返回后,我的管理员用户将被替换为rest框架的
AnonymouseUser
之一


Django REST框架只在一个地方处理匿名用户,并且。因此,虽然您的请求可能通过Django进行身份验证,但它可能没有通过Django REST框架进行身份验证。

@KevinBrown啊,我觉得自己像个傻瓜!是的,正是CSRF不在头球位置,才把球扔了出去。我一把它放在正确的位置,事情就开始正常运转了。非常感谢!