问题描述:使用django开启csrf中间件,前端使用ajax的方式,请求使用除’GET’, ‘HEAD’, ‘OPTIONS’, 'TRACE’时,报错CSRF cookie not set
问题分析:
因为如果开启了csrf功能,前端除了’GET’, ‘HEAD’, ‘OPTIONS’, 'TRACE’请求提交数据时,都需要校验csrftoken,因为前端在请求时没有传csrftoken到后端,所以就会报错
解决办法:
1、先确认后端是否有设置cookie的csrftoken值
判断request.META.get(“CSRF_COOKIE_USED”):如果为ture则设置,如果为false则不设置
2、手动添加设置csrftoken值
在csrf中间件在执行process_response之前,需要设置CSRF_COOKIE_USED为True
调用from django.middleware.csrf的get_token()方法,可以设置CSRF_COOKIE_USED为True
3、前端在请求时,需要获取cookie中的csrftoken值,放到请求头参数中,传给后端
# 获取cookie中的参数值
function getCookie(name) {
var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
return r ? r[1] : undefined;
}
# 请求头格式
headers: {
'X-CSRFToken': getCookie('csrftoken')
},