如何解决Django中ajax发送post请求报403错误CSRF验证失败的问题

发布时间:2021-02-05 14:23:57

来源:亿速云

阅读:92

作者:小新

这篇文章主要介绍了如何解决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代码$(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

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 %}

然后浏览器里查看源码,会有这么一个隐藏标签:

在发起ajax post 请求时,组织json参数时,以下面这种方式使其成为参数,前两个参数是我自定义的请自行忽略,其中键值对中的键名为input标签的name名,值就为其value值

csrf = $('input[name="csrfmiddlewaretoken"]').val();

params = {'sku_id': sku_id, 'count': count, 'csrfmiddlewaretoken': csrf};

这样就可以把csrf中的参数传递给后端,就不会有403错误了,相比前面用了好大一段JS代码要简洁的多

感谢你能够认真阅读完这篇文章,希望小编分享的“如何解决Django中ajax发送post请求报403错误CSRF验证失败的问题”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

ajax的post请求出现403错误,如何解决Django中ajax发送post请求报403错误CSRF验证失败的问题...相关推荐

  1. java406错误怎么解决_Spring MVC Rest服务 返回json报406错误的解决办法

    @ResponseBody & @RequestBody @RequestBody 将 HTTP 请求正文插入方法中,使用适合的HttpMessageConverter将请求体写入某个对象. ...

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

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

  3. python token post403原因_Django中ajax发送post请求 报403错误CSRF验证失败解决方案

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

  4. 禁止(403)CSRF验证失败请求中止即使使用{%csrf_token%}

    如何解决禁止(403)CSRF验证失败请求中止即使使用{%csrf_token%}? 要使csrf保护起作用,需要做一些事情(请查看docs): 你的浏览器必须接受服务器中的Cookie 确保已将' ...

  5. python_django(禁止访问 (403) CSRF验证失败. 请求被中断)

    禁止访问 403 错误 原因 解决方法: 错误 Forbidden (403) CSRF verification failed. Request aborted.禁止访问 (403) CSRF验证失 ...

  6. django ajax请求 csrf验证失败

    如何解决django ajax请求 csrf验证失败的问题: 原文链接:http://stackoverflow.com/questions/5100539/django-csrf-check-fai ...

  7. CSRF验证失败请求中止在Django上

    如何解决CSRF验证失败请求中止在Django上? 你需要将{% csrf_token %}模板标记添加为formDjango模板中元素的子代. 这样,模板将呈现一个隐藏元素,其值设置为CSRF令牌. ...

  8. java报错 csrf_Django项目报错: 禁止访问(403),CSRF验证失败,相应中断

    如果想要取消表单的CSRF防护,可以在模板上删除{% csrf_token %}, 并且在相应的视图函数中添加装饰器@csrf_exempt, 代码如下: from django.views.deco ...

  9. Django项目报错: 禁止访问(403),CSRF验证失败,相应中断

    如果想要取消表单的CSRF防护,可以在模板上删除{% csrf_token %}, 并且在相应的视图函数中添加装饰器@csrf_exempt, 代码如下: from django.views.deco ...

最新文章

  1. mysql 5.6 mysqldump 简单_mysqldump的简单用法及其原理
  2. 保护模式下寻址(易懂)
  3. 用matlab画三维凸起,求助大牛MATLAB画三维等势面
  4. android中matrix的单位,Android中canvas和matrix之间的关系是什么?
  5. 科学家研发机器人混入南极企鹅群 获“友好”对待
  6. 功利性学习:别陷入勤奋陷阱
  7. [CF791D]Bear and Tree Jumps
  8. 如何用Java讲一句话重复五遍_Java 0515 第二次课作业
  9. chameleon 算法_使用Chameleon,Shrinkwrap,Drone / Graphene与Arquillian进行Java EE集成测试...
  10. spring学习(15):required属性
  11. 【数据库实验课堂】实验三:管理SQL Server表数据
  12. XML轻松学习手册(1)XML快速入门
  13. ATL 实现定制的 IE 浏览器栏、工具栏和桌面工具栏
  14. mpfr-3.1.0编译方法
  15. cocos2d-x由Jni实现Java与C++打电话给对方
  16. 网页隐藏index.php,如何隐藏url中的index.php
  17. pip安装时ReadTimeoutError解决办法
  18. 国美易卡的标识符和关键字是什么(国美易卡)
  19. 沈华伟:图神经网络及其应用 | 青源Talk第4期
  20. android : 小米手机 打开开发者 选项 PC 端 安装 apk

热门文章

  1. 解决谷歌浏览器打开空白标签页自动跳转https://www.google.com.hk/webhp?ie=UTF-8gws_rd=crrct=j
  2. Chapter 8 子查询
  3. 位置物联网时代,UWB定位如何应用?
  4. 【人工智能】大语言模型简介 —— A Very Gentle Introduction to Large Language Models without the Hype
  5. 赛扬 7305怎么样 相当于什么水平
  6. oracle nls_nchar_characterset,Oracle的NLS_NCHAR_CHARACTERSET和NLS_CHARACTERSET之间的区别
  7. 【openwrt】netifd组件——netifd-proto脚本分析
  8. 静态HTML CSS网站制作成品 简单的学生网页作业代码【带视频演示】
  9. BSN季度版本2022年4月30日迭代更新预告
  10. Python学习,python中参数传递的方法,你知道几种