vue-resource帖子数据时碰到Django csrf问题的解决

  

公司最近用vue写前端,用vue-resource遇到的一些问题,现在记录下来。

  

<强> vue-resource帖子数据
  

        美元http。邮报》('/someUrl '、数据[选项]),然后(函数(响应){//响应成功回调   (响应){},函数//响应错误回调   });      

vue-resource向后端请求api,公司的后台是用Django开发的,Django为了防止跨站请求伪造,即csrf攻击,提供了CsrfViewMiddleware中间件来防御csrf攻击。

  

我们在html页面里加入{% csrf %}来让django渲染出一个csrf的标签

  

(如果是形式提交表单的话,我们要把这个标签加在形式标签内,如果是用xhr提交的话写在html页面里就可以了)

  

不写在表单表单内,但是实现效果是一样的,我们都需要在文章的表单中提供csrftoken我们在vue里要传送的的数据里要加上csrf的关键

        {数据   csrfmiddlewaretoken:“{{csrf_token}}”   }      

这样django解析表单时会解析到csrf_token,我们发布的数据就不会遇到403年禁止了。

  

其实这样是投机取巧的行为,这样虽然django也能识别,但是遇到复杂的数据时就不行了,比如数组,vue-resource帖子数组的时候,因为我之前在帖子的选项里加了一个选项{emulateJSON:真},这样vue-resource在帖子数据时,会把数据转换成应用程序/x-www-form-urlencoded表单格式,但是这样的话,文章的数组就会被解析成arrry[0]项这样的话,后端是不识别的,会报错。

  

解决方式查到是把csrftoken放在报头里,数据传数据,具体解决方式是加一条

  
  

Vue.http.headers.common [' X-CSRFToken ')=$(“输入[name=' csrfmiddlewaretoken ']”) .val ()

     

其中$(“输入[name=' csrfmiddlewaretoken ']”) .val()是取django的{% csrf %}在模板解析后生成的输入里的csrftoken。

  

其中报头的话django在后台解析的时候会自动加上HTTP_的前缀,所以说我们的报头是X-CSRFToken就可以了。

  

<强> VUE向django发送帖子返回403:CSRF失败:CSRF令牌丢失或错误的

  

<强>问题描述

  

前端是VUE,后端是django。

  

VUE用axios向后端发送帖子代码如下:

        让params=new URLSearchParams ()   参数个数。追加(orderID, orderID)   参数个数。追加(dishID, dishID)   axios。帖子(loginUrL params})   不要犹豫(反应=比;{   console.log(响应)   cb ()   })   .catch(错误=比;{   console.log(错误)   errorCb ()   })      

但是服务器返回403错误,点开一看,CSRF失败:CSRF令牌丢失或错误的

  

<强>原因

  

根据这个链接https://stackoverflow.com/a/26639895

  

这是一个django的跨域访问问题。

  

django,会对合法的跨域访问做这样的检验,饼干里面存储的‘csrftoken’,和文章的标题里面的字段“X-CSRFToken作比较,只有两者匹配,才能通过跨域检验。否则会返回这个错误:CSRF失败:CSRF令牌丢失或错误的

  

  

由上面的分析可以得出,只要在帖子请求的头添加一个字段‘X-CSRFToken’,这个字段和饼干里面的‘csrftoken一样就好了。

  

在帖子请求添加一个头,内容如下:

  
  

{标题:{“X-CSRFToken”: this.getCookie (csrftoken)}

     

其中,getCookies是这样一个函数,用于将饼干里面的内容按名字取出:

        getCookie(名字){   var值=' https://www.yisu.com/zixun/; ' +。   var=value.split部分(';' +名字+ '=')   如果(部分。长度===2)返回parts.pop () .split (“;”) .shift ()   },      

最终的帖子请求如下:

        参数个数。追加(orderID, orderID)   参数个数。追加(dishID, dishID)   axios。帖子(loginUrL params,{头:{“X-CSRFToken”: this.getCookie (csrftoken)}})   不要犹豫(反应=比;{   console.log(响应)   cb ()   })   .catch(错误=比;{   console.log(错误)   errorCb ()   })      

以上这篇vue-resource帖子数据时碰到Django csrf问题的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

vue-resource帖子数据时碰到Django csrf问题的解决