Bootstrap

django前后端分离_CSRF解决方案

前言

现在都是采用前后端分离的方式,所以并不能采用传统的发送,直接在渲染页面的时间加上csrftoken。
我也看好多网上写的方案,都乱,所以我总结一下:
首先有两张方法,都是直接关掉csrf的,一个是在setting.py里面关掉csrf中间件,另一种是在view视图里面加上装饰器,以达到我们的目的,都是我觉得这样的方式太激进了,不行我们就关掉?我不喜欢这样的方法,所以我在下面没有介绍,如果你们也想这样,可以去看看别人写的,有思路,找起来也不难。

不关闭csrf的解决方案

  1. 思路
    想办法在静态页面生成的时候,网站上就携带了csrftoken,然后我们post请求的时候,获取即可!思路简单,那么怎么做呢?

  2. 首先在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)
	   }
	}
})

最后,有什么不同的话,也可以私信我,我们可以一起解决!!!

;