2014-03-19 26 views
3

我创建了一个Django的REST的框架API,让我成功运行通过命令行这样一个PUT请求:为什么我在从网站执行jQuery Ajax PUT时遇到CSRF错误?从命令行运行良好。

% 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"); 
     } 
    } 
); 

当此阿贾克斯命令运行,但是,我看到在Chrome开发控制台以下错误:

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

在进一步调查之后我也发现了这个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()), 

回答

4

在命令行中例如你使用-u myUser:myPassword,所以你明确地使用HTTP基本认证进行认证。

在AJAX的例子中,你没有这样做,而是认证隐式地基于会话。这意味着你需要包含一个CSRF令牌。

查看有关如何包含CSRF令牌herehere的文档。

+0

谢谢汤姆。并感谢创造这样一个伟大的框架。 –

相关问题