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