django前后端分离模式的csrf报错403:CSRF cookie not set

问题描述:使用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')
},

你可能感兴趣的:(django)