2011-05-21 20 views
1

最近的Django版本要求將csrf_token與每個POST請求一起發送(無論是通過AJAX還是通過正常請求)。如何做ajaxSetup before發送像DOJO工具箱中的東西,以在DOJO AJAX POST中提供CSRF令牌

Flaw in CSRF handling fixed.

他們認爲,Django的,現在將接受自定義HTTP標頭X-CSRFTOKEN的CSRF令牌,以及在表單提交本身的易用性與流行的JavaScript工具包,允許插入自定義標題到所有的AJAX請求。

他們舉一個例子jQuery中

$.ajaxSetup({ 
    beforeSend: function(xhr, settings) { 
     if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
      // Only send the token to relative URLs i.e. locally. 
      xhr.setRequestHeader("X-CSRFToken", 
           $("#csrfmiddlewaretoken").val()); 
     } 
    } 
}); 

要做到這一點,我無法弄清楚如何做Dojo Toolkit的類似的東西。 我一直在使用dojo.rpc.JsonService()。

請提出一個在DOJO做類似的工作嗎?

或者唯一的選擇是對每個xhrPost請求單獨做這件事?

回答

1

聲明:我對django不熟悉。

擴展dojo xhr定義之外(不會推薦它),我想說你可能想要擴展dojo.xhr或者構建一個實用方法。

實用程序的方法將在混合或設定的 「報頭」 的參數屬性傳遞到dojo.xhr:

myCustomNameSpace.xhr =函數(xhrArgs){
變種csrfHeader = { 「X-CSRFToken」 :dojo.byId(csrfmiddlewaretoken).val(); }; xhrArgs.headers?dojo.mixin(xhrArgs.headers,csrfHeader):xhrArgs.headers = csrfHeader; dojo.xhrPost(xhrArgs);
};

通過myCustomNameSpace.xhr調用({method:「POST」,url:「http:// www .....」});

1

的{%csrf_token%}將出現在表單就像這樣:

<input type='hidden' name='csrfmiddlewaretoken' value='...' /> 

所以只搭配你的內容是這樣的:

var form = dojo.byId("postForm"); 
dojo.xhrPost({url:form.action, 
    content:{text:form.text.value, csrfmiddlewaretoken:form.csrfmiddlewaretoken.value}, 
) 
相關問題