Ajax常用方法与后端(Django)通信403的解决方案
日常前言
最近Ajax用的越来越多了,每次用的时候都总是要去慢慢的翻看零散记录的笔记,So,今天整理一份详细的笔记,相信对各位会有点用。
开始
1、$.ajax()
用于向服务器发送HTTP请求,通过不重新加载页面的方式,更新页面的数据。常用的请求方式有GET和POST两种,e.g:
$.ajax({
url: '/messyAjax/',
type: 'GET',
success: function (data) {
console.log('服务器数据为:'+ data);
}
});
2、 $.load()
load方法用于加载服务器数据,然后把数据返回到选择器选择到的div内。
- 常用于加载加载顶部导航栏、图片、音乐、用户个人信息等等。
- 若加载的是html文件,load()会自动去除html、body、script标签。
- 若加载的html文件需依赖js进行dom操作,则在load()函数里加入回调函数,使用
$.getScript()
函数进行加载
- 若加载的html文件需依赖js进行dom操作,则在load()函数里加入回调函数,使用
$('.g-topmodel').load('top_model.html',function(){
console.log('导航栏dom加载完毕')
$.getScript("topmodel.min.js");
});
3、 如何正确的向后端(Django)发送ajax请求
为什么会出现403?
Django是Python中的一个后端框架,自身集成了许多web安全的模块,其中就包含csrf(跨站请求伪造)
,下面通过一张图简单了解一下。Django的防御机制呢,就是在所有含有post请求的页面全部设置一个实时刷新的csrf_token
,当post请求发送时,验证这个值,若不符,返回403。
这时有人要问了,我在自己的网站下发送的Ajax请求,又不是跨站,他还要403吗?答案是肯定的,csrf_token
的生成机制是,只要是一个请求,都会验证是否正确,Ajax发送的时候是空状态,没有任何信息,所有最后还是会返回403。
####怎么解决呢?
答案是:获取当前页的csrf_token
的值
<script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
<script>
$.ajax({
url: '/messy_ajax/',
type: 'POST',
headers:{
# 通过jq的cookie库拿到csrf_token加入在请求头中进行返回
"X-CSRFToken":$.cookie('csrftoken')
},
data: {
'Messy':'Messy',
},
success: function () {
console.log('请求发送成功!')
}
});
</script>
其他解决方案?
暂时没有其他的方法,试过几种的其他方法都失败了,以下罗列失败的方法,直接跳过坑(注意是失败的方法,不要看错了)
- 在ajaxSetup里设置csrf data
$.ajaxSetup({data: {csrfmiddlewaretoken: '{{ csrf_token }}' }});
- 导入第三方编辑的csrf.js
- 获取html中的{% csrf_token %}的值导入data(都ajax,当然html中没有csrf_token了…)
本文作者: Messy
原文链接:https://www.messys.top/detail/36
版权声明: 本博客所有文章除特别声明外, 均采用 CC BY-NC-SA 4.0 许可协议. 转载请注明出处!