2014-03-19 24 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

謝謝湯姆。並感謝創造這樣一個偉大的框架。 –

相關問題