公司最近用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问题的解决