jquery - 为什么从网站执行 jQuery Ajax PUT 时会出现 CSRF 错误?从命令行运行良好。

标签 jquery api django-rest-framework django-csrf

我创建了一个 Django-Rest-Framework API,它允许我通过命令行成功运行 PUT 请求,如下所示:

% curl -X PUT -u myUser:myPassword http://127.0.0.1:3001/api/myEndpoint/64/
{"id": 64, "myAttr1": "Blah1", "myAttr2": "Blah2"}

在我的 Web 应用程序中,我有以下 JQuery AJAX(据我所知),如果我以 myUser 身份登录,它应该运行完全相同的命令:

$.ajax(
    {
        url: "/api/myEndpoint/64/",
        type: "PUT",
        success: function( data ) 
        {
            console.log("Do Something Here");
        }
    }
);

但是,当此 .ajax 命令运行时,我在 Chrome 开发控制台中看到以下错误:

PUT http://127.0.0.1:3001/api/myEndpoint/64/ 403 (FORBIDDEN) 

经过进一步调查,当我运行 .ajax 时,我还发现了这个 Django 警告:

WARNING [django.request:99] Forbidden (CSRF token missing or incorrect.): /api/myEndpoint/64/

为什么这可以在命令行中运行,但不能在我的网络浏览器中运行?我该如何进行这项工作?我不完全理解 CSRF 的工作原理。很想让它正常工作。

作为引用,以下是views.py 的摘录:

class MyEndPoint(mixins.UpdateModelMixin, generics.GenericAPIView):
    queryset = MyObject.objects.all()
    serializer_class = MyObjectSerializer

    def put(self, request, *args, **kwargs):
        logger.debug("myID = %s" % kwargs["myID"])
        ...

以下是 urls.py 的摘录:

url(r'^api/myEndpoint/(?P<myID>\d+)/?$', views.MyEndPoint.as_view()),

最佳答案

在命令行示例中,您使用 -u myUser:myPassword,因此您使用 HTTP 基本身份验证进行显式身份验证。

在 AJAX 示例中,您没有这样做,而是隐式基于 session 进行身份验证。这意味着您需要包含 CSRF token 。

查看有关如何包含 CSRF token 的文档,herehere .

关于jquery - 为什么从网站执行 jQuery Ajax PUT 时会出现 CSRF 错误?从命令行运行良好。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22497492/

相关文章:

javascript - 仅过滤 1 个菜单

javascript - 即使 HTML 5 验证停止表单提交也会调用 jQuery 提交函数

python - Flask - 嵌套的 rest api - 使用 methodview 以外的东西或者我做了一个糟糕的设计?

django - 使用 Django REST 框架进行实时聊天?

python - 使用 get() django 返回多个对象

javascript - 成功后如何返回几条数据?

javascript - 幻灯片不工作?

java - 如何用 jmeter 中 java 函数/方法的结果替换部分 json 请求正文?

javascript - 在连续的 Ajax 函数中使用相同的变量

django - 如何在父序列化程序中获取总子项