前言
现在都是采用前后端分离的方式,所以并不能采用传统的发送,直接在渲染页面的时间加上csrftoken。
我也看好多网上写的方案,都乱,所以我总结一下:
首先有两张方法,都是直接关掉csrf的,一个是在setting.py里面关掉csrf中间件,另一种是在view视图里面加上装饰器,以达到我们的目的,都是我觉得这样的方式太激进了,不行我们就关掉?我不喜欢这样的方法,所以我在下面没有介绍,如果你们也想这样,可以去看看别人写的,有思路,找起来也不难。
不关闭csrf的解决方案
-
思路
想办法在静态页面生成的时候,网站上就携带了csrftoken,然后我们post请求的时候,获取即可!思路简单,那么怎么做呢? -
首先在view视图定义,向后端请求token的函数
from django.middleware.csrf import get_token
# /api/gettoken 这个是地址 url路由的配置就是这个,我下面就不介绍怎么配置路由了,比较简单
class GetTokenView(View):
# 向服务器请求token
def get(self, request):
token = get_token(request)
return JsonResponse({'res':0, "token":token})
3.js的编写
$(document).ready(function(){
// 在页面加载的时候,先向服务器获取token
$.ajax({
url:"http://127.0.0.1:8000/api/gettoken",
dataType: "json",
type: "GET",
success:function (req) {
if ("0" == req.res){
csrftoken = req.token; // 接受上边视图函数返回的token,保存到全局变量中
document.cookie = 'csrftoken=' + req.token; // token设置到cookie中
}
else {
alert("获取token失败") // 可以不要,是用来我们测试的
}
}
})
})
// 这是ajax请求,因为前后端分离是需要跨域请求的,所有url是要写绝对路劲
$.ajax({
url: "http://127.0.0.1:8000/api/join",
dataType: "json",
data: jsondata,
type: 'POST',
headers: {'X-CSRFtoken': csrftoken},
success:function (req) {
if ('0' == req.res){
alert("发送成功")
}
else {
alert(req.errmsg)
}
}
})