Django作为API + ReactJS - Redux:带有CSRF令牌的POST请求,但仍然没有设置响应CSRF令牌

时间:2017-01-26 16:48:08

标签: javascript django post csrf fetch

环顾四周之后我想确定我做得对,但我开始怀疑和最糟糕:我的选择/想法已经用完了。

所以我使用django作为API(我只获得一些资产的请求),除了基类视图中的一个POST方法以允许我的用户下载文件。

问题是django期望在我的POST上有一个CSRF令牌。

所以,这是我从reactjs做的事情:

export function sendData(endpoint, req, data) {
return dispatch => {
    dispatch(requestData(data));
    let csrfToken = Cookies.get('csrftoken');

    return fetch(endpoint, {
        method: req,
        headers: {
            'Content-Type': 'application/json',
            'X-CSRFToken': csrfToken,
        },
        body: JSON.stringify(data),
    })
    .then(checkStatus)
    .then(reponse => {
        console.log("Success!");
    }).catch(err => {
        err.response.json().then((json) =>{
            let { Errors, Result } = json;
            console.log('request failed: ', Errors, " ", Result);
        });
    });
};

};

如您所见,我正在使用'whatwg-fetch'库。 我尝试将X-CSRFToken替换为X-CSRF-Token,但请求被阻止为chrome“选项”,似乎没有正确发送: Request header field x-csrf-token is not allowed by Access-Control-Allow-Headers in preflight response.

但我仍然得到了我一直在阅读的错误:

  

CSRF验证失败。请求中止。   失败的原因:       未设置CSRF cookie。

Urgh。

我在这里缺少什么?

在我看来,我已经尝试了各种装饰工具:

class DownloadAssetsView(ViewUrlMixin, ListView):
    @csrf_exempt
    def post(self, request, *args, **kwargs):
        print(request)
        return HttpResponse("coucou", status=200, content_type='application/json')

但我不能让它发挥作用..

PS:django根本没有模板渲染到我的客户端。

1 个答案:

答案 0 :(得分:1)

我们在我们的项目中遇到了这个问题.csrf令牌用于阻止未知令牌和请求。如果你看到有关csrf令牌的文档,你可以找到它.csrf令牌阻止你对django服务器的外部请求。我们合并了将项目反应给我们的django.it fixed.try,我不是这方面的专家,但你可以查看一下。