Django中ajax发送post请求 报403错误CSRF验证失败解决方案


Posted in Python onAugust 13, 2019

前言

今天学习Django框架,用ajax向后台发送post请求,直接报了403错误,说CSRF验证失败;先前用模板的话都是在里面加一个 {% csrf_token %} 就直接搞定了CSRF的问题了;很显然,用ajax发送post请求这样就白搭了;

文末已经更新更简单的方法,上面的略显麻烦

上网上查了一下,看了几个别人的博客,才知道官网也早有说明解决办法,大致流程就是:

就是新建一个JavaScript文件,然后把网上给的代码粘贴进去,然后在你使用ajax的页面把它引入一下;当然,如果你在网上找到的解决代码包含JQuery的话,那就需要在引入的JQuery之后引入了(毕竟解决代码不唯一,网上一找一堆,基本都是对的,原生JS和带JQuery的都有);

文末会附上我使用的JS相关代码,也可以去网上找!

如果上述没有解决你的问题,那就说明你和我踩了同样的一个小坑........

用了上面查到的方法,直接就解决了我的问题,但是随着我对代码修修改改、清除了相关页面的cookie,吃个饭再运行,竟然又报403的CSRF错误了;百思不得其解的我又去Django官网看了一下相关部分的文档,一堆英文看看大概找到了问题;

我发现我把html页面里面原先加的 {% csrf_token %} 这个东西给删掉了,加上谷歌的相关页面cookie被我一清除,csrftoken就被咔嚓了,再刷新页面,去html页面里也找不到 {% csrf_token %} ,没有了csrftoken那个cookie值,即使有相关的JS代码也毛用没有了;

打个比方:

  • 你吃饭需要工具,也就是筷子,但是饭都没有,你拿个筷子吃什么呀!!!
  • 这里的筷子就是解决问题的JS代码,而饭就是这个 {% csrf_token %} ,更确切说因该是浏览器中的叫 csrftoken 的 cookie;
  • 两者都有了,才能彻底解决吃饭的问题;

总结下来:

  • 使用ajax发送post请求时,html页面里一定要有 {% csrf_token %},在body里应该就没什么大问题;
  • 然后引入相关的JS解决代码;
  • 补充一下,和表单没什么太大关系,因为我的html页面里就没有表单,直接通过点击按钮发送的ajax请求;

Django中ajax发送post请求 报403错误CSRF验证失败解决方案

需要引入的相关JS代码

$(document).ajaxSend(function(event, xhr, settings) {
  function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
      var cookies = document.cookie.split(';');
      for (var i = 0; i < cookies.length; i++) {
        var cookie = jQuery.trim(cookies[i]);
        // Does this cookie string begin with the name we want?
        if (cookie.substring(0, name.length + 1) == (name + '=')) {
          cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
          break;
        }
      }
    }
    return cookieValue;
  }
  function sameOrigin(url) {
    // url could be relative or scheme relative or absolute
    var host = document.location.host; // host + port
    var protocol = document.location.protocol;
    var sr_origin = '//' + host;
    var origin = protocol + sr_origin;
    // Allow absolute or scheme relative URLs to same origin
    return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
      (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
      // or any other URL that isn't scheme relative or absolute i.e relative.
      !(/^(\/\/|http:|https:).*/.test(url));
  }
  function safeMethod(method) {
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  }
 
  if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
    xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
  }
});

简单方法

  • 首先在你需要发起ajax post请求的页面的里面随便一个地方加上 {% crsr_token %}
  • 然后浏览器里查看源码,会有这么一个隐藏标签:<input type="hidden" name="csrfmiddlewaretoken" value="jlYb5LCP21TxGapw7OuO0xbHmRnyFzlgDapiDl1M1Vp6dOjPM4BlHOgOVeuPYQ27">
  • 在发起ajax post 请求时,组织json参数时,以下面这种方式使其成为参数,前两个参数是我自定义的请自行忽略,其中键值对中的键名为input标签的name名,值就为其value值
  • csrf = $('input[name="csrfmiddlewaretoken"]').val();
  • params = {'sku_id': sku_id, 'count': count, 'csrfmiddlewaretoken': csrf};
  • 这样就可以把csrf中的参数传递给后端,就不会有403错误了,相比前面用了好大一段JS代码要简洁的多

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用IPython来操作Docker容器的入门指引
Apr 08 Python
python中enumerate函数用法实例分析
May 20 Python
解读! Python在人工智能中的作用
Nov 14 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
Apr 02 Python
解决python 输出是省略号的问题
Apr 19 Python
基于python OpenCV实现动态人脸检测
May 25 Python
python3中os.path模块下常用的用法总结【推荐】
Sep 16 Python
对python条件表达式的四种实现方法小结
Jan 30 Python
python3.4+pycharm 环境安装及使用方法
Jun 13 Python
Django应用程序入口WSGIHandler源码解析
Aug 05 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
Python实现文本文件拆分写入到多个文本文件的方法
Apr 18 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 #Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 #Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 #Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 #Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 #Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 #Python
Python字符串处理的8招秘籍(小结)
Aug 13 #Python
You might like
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
js函数的延迟加载实现代码
2012/10/11 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
理解JS事件循环
2016/01/07 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
详解vue父子模版嵌套案例
2017/03/04 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
JS原生带缩略图的图片切换效果
2018/10/10 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
Python中关于字符串对象的一些基础知识
2015/04/08 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
会计毕业生自荐信
2013/11/21 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书
党旗在我心中演讲稿
2014/09/15 职场文书
机关作风建设剖析材料
2014/10/11 职场文书
实习证明格式范文
2014/10/14 职场文书
会计求职简历自我评价
2015/03/10 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
Java8中接口的新特性使用指南
2021/11/01 Java/Android