如果是form表单 直接在表单里增加 {% csrf_token %} 这个就好了
方式一:
个人觉得用这个方便
添加请求头 就不是data里的值了 <script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script> ##这里走的是cdn 应该导入文件 $.ajax({ headers:{"X-CSRFToken":$.cookie('csrftoken')}, })
#实现原理:通过jquery操作cookie拿到key对应的值
方式二:
data:{ csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() },
实现的原理:
在html的某一个位置 写上 {% csrf_token %} 这样会在页面渲染一个 这样的input标签
<input type="hidden" name="csrfmiddlewaretoken"
value="fQLSrDayErQNNzyvxLNa7WcmHKuJtwOxdjUmqOymnLUOkGFJDwGwFRshOjFoamHO">
通过在data里的设置拿到key-csrfmiddlewaretoken对应的value,key不变,主要就是拿到固定key对应的value这个随机字符串
方式三:
$.ajax({ data:{ csrfmiddlewaretoken:$.cookie("csrfmiddlewaretoken") }, 或者: <script src="{% static 'js/jquery.cookie.js' %}"></script> $.ajax({ headers:{"X-CSRFToken":$.cookie('csrftoken')}, }) 实现原理:
利用jquery操作cookie拿到key-csrfmiddlewaretoken对应的value
1.确定事件
ajax不会闲的没事自己触发执行,需要事件去触发执行呢
例如:放在button的click事件中 <button class="ajax1">ajaxsend</button><span class="info"></span> <script> $('button').click(function () { $.ajax({ url:'/sendajax/', type:'get', success:function (data) { $('.info').html(data) } }) }) </script>
2.格式以及必要参数
$().ajax({ url:'/sendajax/', #必选参数 路径 success:function () {} #必选参数 如果成功的话就执行函数 (data)接收的是服务端返回给客户端的数据 type:'get' or 'post' #默认为get 大小写均可 data:{ #发送给服务端的数据 自己组建键值对 "k1":"v1", "k2":"v2" } })
3.ajax的参数
$().ajax({ url:'/sendajax/', #必选参数 路径 success:function () {} #必选参数 如果成功的话就执行函数 (data)接收的是服务端返回给客户端的数据 type:'get' or 'post' #默认为get 大小写均可 data:{ #发送给服务端的数据 自己组建键值对 当前ajax请求要携带的数据,是一个json的object对象,ajax方法就会默认地把它编码成某种格式 "k1":"v1", "k2":"v2" }
error: function (jqXHR, textStatus, err)
{
// jqXHR: jQuery增强的xhr
// textStatus: 请求完成状态
// err: 底层通过throw抛出的异常对象,值与错误类型有关 err是错误信息
console.log(arguments); }, })
比较重要的一个参数 contentType
默认值: contentType:"application/x-www-form-urlencoded", 数据格式:?user=alex&pwd=123 其他方式: contentType:"application/json", 数据格式:{"user":"alex","pwd":"123"} 字典格式 双引号 服务端取数据: 这样取出来的数据并不是元数据,是字典,是经过包装的 name=request.POST.get('name') pwd=request.GET.get('pwd') #{"user":"alex","pwd":"123"} 我们直接取出的数据,经过了Django的处理 处理过程基本是 服务端识别客户端的编码 "application/x-www-form-urlencoded" 通过request.body() 拿到的数据是:?user=alex&pwd=123 然后Django自己处理数据格式 我们通过 name=request.POST.get('name') pwd=request.GET.get('pwd') #{"user":"alex","pwd":"123"} 拿到的是字典 也就是Django从request.body()里 处理好格式的数据 ##注意 request.POST/GET.get() 这种取值的方式对应的就是客户端使用"application/x-www-form-urlencoded"这种编码,如果换了,用这种方法可就不一定能取出值来了 但是request.body()是一定可以的,这里可是元数据哦 如果用 "application/json" 这种方式发送数据 发送的是json字符串 首先用request.POST/GET.get() 肯定是拿不到数据了 现在客户端发给服务端的是json字符串,服务端拿到的是json字符串,服务端不认识json数据,需要 import json obj=request.body() #b’name=yuan&pwd=123' 是个bytes类型 json.loads(obj) 反序列化 对比一下: request.POST # <QueryDict:{'name':['yuan'],'pwd':'[123]'}> request.GET # <QueryDict:{'name':['yuan'],'pwd':'[123]'}> request.body # b’name=yuan&pwd=123' 是个bytes类型