环顾四周之后我想确定我做得对,但我开始怀疑和最糟糕:我的选择/想法已经用完了。
所以我使用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根本没有模板渲染到我的客户端。
答案 0 :(得分:1)
我们在我们的项目中遇到了这个问题.csrf令牌用于阻止未知令牌和请求。如果你看到有关csrf令牌的文档,你可以找到它.csrf令牌阻止你对django服务器的外部请求。我们合并了将项目反应给我们的django.it fixed.try,我不是这方面的专家,但你可以查看一下。