как сделать ajaxSetup beforeSend подобные вещи в инструментарии DOJO, чтобы предоставить токен CSRF в DOJO AJAX POST - PullRequest
1 голос
/ 21 мая 2011

Недавние выпуски Django требуют, чтобы csrf_token отправлялся вместе с каждым запросом POST (либо через AJAX, либо через обычный запрос).

Исправлена ​​ошибка в обработке CSRF.

Они предполагают, что Django теперь будет принимать токен CSRF в настраиваемом заголовке HTTP X-CSRFTOKEN, а также в самой отправке формы, для простоты использования с популярными наборами инструментов 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. Я использую dojo.rpc.JsonService () некоторое время.

Пожалуйста, предложите способ сделать что-то подобное в DOJO?

Или единственный вариант - сделать это для каждого запроса xhrPost отдельно?

Ответы [ 2 ]

1 голос
/ 25 октября 2011

{% 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},
)
1 голос
/ 04 октября 2011

Отказ от ответственности: я не знаком с Джанго.

Помимо расширения базового определения dojo xhr (я бы не рекомендовал его), я бы сказал, что вы можете расширить dojo.xhr или создать служебный метод.

Служебный метод будет смешивать или устанавливать атрибут «заголовки» аргументов, передаваемых в dojo.xhr:

myCustomNameSpace.xhr = function (xhrArgs) {
var csrfHeader = {"X-CSRFToken": dojo.byId (csrfmiddlewaretoken) .val (); }; ? xhrArgs.headers dojo.mixin (xhrArgs.headers, csrfHeader): xhrArgs.headers = csrfHeader; dojo.xhrPost (xhrArgs);
};

Вызывается через myCustomNameSpace.xhr ({метод: "POST", URL: "http://www. ...."});

...