Django中ajax发送post请求,报403错误CSRF验证失败解决办法

今天学习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请求;

  

 

 

需要引入的相关JS代码

 

 

 1 $(document).ajaxSend(function(event, xhr, settings) {
 2     function getCookie(name) {
 3         var cookieValue = null;
 4         if (document.cookie && document.cookie != '') {
 5             var cookies = document.cookie.split(';');
 6             for (var i = 0; i < cookies.length; i++) {
 7                 var cookie = jQuery.trim(cookies[i]);
 8                 // Does this cookie string begin with the name we want?
 9                 if (cookie.substring(0, name.length + 1) == (name + '=')) {
10                     cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
11                     break;
12                 }
13             }
14         }
15         return cookieValue;
16     }
17     function sameOrigin(url) {
18         // url could be relative or scheme relative or absolute
19         var host = document.location.host; // host + port
20         var protocol = document.location.protocol;
21         var sr_origin = '//' + host;
22         var origin = protocol + sr_origin;
23         // Allow absolute or scheme relative URLs to same origin
24         return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
25             (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
26             // or any other URL that isn't scheme relative or absolute i.e relative.
27             !(/^(\/\/|http:|https:).*/.test(url));
28     }
29     function safeMethod(method) {
30         return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
31     }
32  
33     if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
34         xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
35     }
36 });

 简单方法

  • 首先在你需要发起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代码要简洁的多

 

转载于:https://www.cnblogs.com/springionic/p/10816659.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在EXCEL中添加下拉框

筛选主要是将已有列的信息以下拉框的形式显示出来 选中数据栏中的筛选按钮即可生成 如果是想添加未有信息则如下图步骤 首先&#xff0c;选择你要出现下拉的区域&#xff0c;在数据栏中的选择数据有效性 然后&#xff0c;下面对话框中&#xff0c;有效性条件中按如下设置即可&a…

每次新增页面复制粘贴?100多行源码的 element-ui 的新增组件功能教你解愁

1. 前言大家好&#xff0c;我是若川。最近组织了源码共读活动&#xff0c;感兴趣的可以点此加我微信ruochuan12 参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。已进行三个月了&#xff0c;很多小伙伴表示收获颇丰。想学源码&#xff0c;极力推荐之前我…

原子设计_您需要了解的有关原子设计的4件事

原子设计重点 (Top highlight)Industries such as Architecture or Industrial Design have developed smart modular systems for manufacturing extremely complex objects like airplanes, ships, and skyscrapers. Inspired by this, Atomic Design was proposed as a syst…

C#中的Clipboard与ContextMenuStrip应用举例

今天&#xff0c;突然想起了怎样在一个文本中实现复制、剪切与粘贴的功能&#xff0c;并给这些功能添加右键的快捷方式。于是&#xff0c;就用自己的VS2008写了一个简单的小应用&#xff0c;以熟悉C#中剪贴板与快捷菜单的使用。 首先&#xff0c;我们不难发现&#xff0c;剪贴板…

控制台ui_设计下一代控制台UI

控制台ui游戏UX (GAMES UX) Yesterday’s Sony presentation showed us the final look of the PlayStation 5, as well as an impressive of next-gen games that will be released with it. What we didn’t get to see, however, is the new operating system and it’s use…

写给前端新手看的一些模块化知识

大家好&#xff0c;我是若川。最近组织了源码共读活动&#xff0c;感兴趣的可以点此加我微信ruochuan12 进群参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。已进行三个月了&#xff0c;很多小伙伴表示收获颇丰。一、 为什么需要模块化以前没有模块化时…

代码实现照片素描_我的代码素描之旅

代码实现照片素描In 2018 I started the process of consistently creating and posting my code sketches online. These are small animations I make with code and post on instagram. Through these sketches I tried to visually express my ideas using color, animatio…

真效率神器,UI稿智能转换成前端代码,准确率极高

大家好&#xff0c;我是若川。在这充满网络促销活动的几个月&#xff0c;倍感压力的&#xff0c;除了你的口袋&#xff0c;是否还有程序员的发量呢&#xff1f;每年的双十一、双十二购物狂欢节&#xff0c;各大电商平台都会上线让消费者充满购买欲望的活动页面&#xff0c;而这…

几个用于序列化的代码片段

参考JavaScriptSerializer,一般用来做JSON格式化http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer.aspx http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptconverter.aspxDataContractSeria…

桌面图标摆放图案_用图标制作醒目的图案

桌面图标摆放图案Level up your video calls with a custom backdrop created using Noun Project icons.使用使用Noun Project图标创建的自定义背景来升级视频通话。 The only thing more visually pleasing than a well-designed icon is a neat, eye-catching pattern made…

3个多月,近3000人参与的源码共读,诚邀加入~

大家好&#xff0c;我是若川。众所周知&#xff0c;从8月份开始&#xff0c;我组织了源码共读活动&#xff0c;每周学习200行左右的源码&#xff0c;到现在持续了3个多月&#xff0c;坚持答疑解惑。帮助了不少人&#xff0c;还是挺开心的。另外&#xff0c;涌现了很多优秀的读者…

“这张图告诉你什么?”

For data to be impactful, it must be understood.为了使数据具有影响力&#xff0c;必须理解它。 I’ve happily spent hundreds and hundreds of hours of my life watching users misunderstand data visualizations. I’m strangely hooked on it.我快乐地度过了数百个小…

我们从 UmiJS 迁移到了 Vite

大家好&#xff0c;我是若川。最近组织了源码共读活动&#xff0c;感兴趣的可以点此加我微信ruochuan12 进群参与&#xff0c;每周大家一起学习200行左右的源码&#xff0c;共同进步。已进行三个月了&#xff0c;很多小伙伴表示收获颇丰。我们从 UmiJS迁移到 Vite 已经上线半年…

将DataTable的内容以EXCEl的形式导出到本地

1.在搞项目的时候一般会遇到&#xff0c;将GridView或者Repeater的内容以Excel的形式保存到本地&#xff0c;即导出功能。我总结了两个方法。 方法一&#xff1a; 1 DataTable dt query.GetItems().GetDataTable();2 if (dt ! null)3 {4 …

智能家居数据库设计_设计更智能的数据表

智能家居数据库设计重点 (Top highlight)Data tables are hard. There are many different ways to think about them. So, naturally, the first step would be to figure out what your users need.数据表很难。 有许多不同的方式来考虑它们。 因此&#xff0c;自然地&#x…

可能是全网首个前端源码共读活动,诚邀你加入一起学习

大家好&#xff0c;我是若川。众所周知&#xff0c;从8月份开始&#xff0c;我组织了源码共读活动&#xff0c;每周学习200行左右的源码&#xff0c;到现在持续了3个多月&#xff0c;坚持答疑解惑。帮助了不少人&#xff0c;还是挺开心的。另外&#xff0c;涌现了很多优秀的读者…

线段树专辑——pku 3667 Hotel

http://poj.org/problem?id3667 哈哈&#xff0c;经典中的经典题啊。利用线段树求最大连续空闲区间&#xff0c;并返回空闲区间的起点坐标。 View Code 1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 6 …

houseparty不流畅_重新设计Houseparty –用户体验案例研究

houseparty不流畅Houseparty has become very popular during the COVID-19 period because it helps you connect with others in a fun way. The concept is simple, you open the app and jump on a video call with your friends. You can even play online games with the…

你不知道的 Node.js 工具函数

从类型判断说起在 JavaScript 中&#xff0c;进行变量的类型校验是一个非常令人头疼的事&#xff0c;如果只是简单的使用 typeof 会到各种各样的问题。举几个简单的&#x1f330;&#xff1a;console.log(typeof null) // object console.log(typeof new Array) // object cons…

Java应用集群下的定时任务处理方案(mysql)

今天来说一个Java多机部署下定时任务的处理方案。 需求: 有两台服务器同时部署了同一套代码&#xff0c; 代码中写有spring自带的定时任务&#xff0c;但是每次执行定时任务时只需要一台机器去执行。 当拿到这个需求时我脑子中立马出现了两个简单的解决方案&#xff1a; 利用ip…