### 11.11 csrf装饰器
```python
from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie
csrf_exempt #某个视图不需要进行csrf校验
csrf_protect #某个视图需要进行csrf校验
ensure_csrf_cookie #确保生成csrf的cookie
```
csrf功能:
1.csrf中间件中执行process_request:
1. 从cookie中获取到csrftoken的值
2. csrftoken的值放入到 request.META
2.执行process_view
1. 查询视图函数是否使用csrf_exempt装饰器,使用了就不进行csrf的校验
2. 判断请求方式:
1. 如果是GET', 'HEAD', 'OPTIONS', 'TRACE'
不进行csrf校验
2. 其他的请求方式(post,put)
进行csrf校验:
1.获取cookie中csrftoken的值
获取csrfmiddlewaretoken的值
能获取到 ——》 request_csrf_token
获取不到 ——》 获取请求头中X-csrftoken的值 ——》request_csrf_token
比较上述request_csrf_token和cookie中csrftoken的值,比较成功接收请求,比较不成功拒绝请求。
#### 11.11.1 ajax
详情地址:https://www.cnblogs.com/maple-shaw/articles/9524153.html
json的基础
json
一种数据交换的格式
python
支持的数据类型:字符串、数字、列表、字典、布尔值、None
转化:序列化 josn.dumps(python的数据) josn.dump(python的数据,f)
反序列化 josn.loads(json的字符串) josn.load(json的字符串,f)
js
支持的数据类型:字符串、数字、数组、对象、布尔值、null
转化:
序列化:JSON.stringfy(js的数据类型)
反序列化:JSON.parse(json的字符串)

ajax的定义:
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。
特点:
1. 异步
2. 局部刷新
3. 传输的数据量少
ajax的标准格式
$.ajax({
url:发送的地址,
type:请求方式,
processData:false; //不处理编码方式
contentType:false; //不处理请求头
data:formobj,
success:function(res){
响应体
}
})
jquery发ajax请求
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AJAX局部刷新实例</title>
</head>
<body>
<input type="text" id="i1">+
<input type="text" id="i2">=
<input type="text" id="i3">
<input type="button" value="AJAX提交" id="b1">
<script src="/static/jquery-3.2.1.min.js"></script>
<script>
$("#b1").on("click", function () {
$.ajax({
url:"/ajax_add/",
type:"GET",
data:{"i1":$("#i1").val(),"i2":$("#i2").val()},
success:function (data) {
$("#i3").val(data);
}
})
})
</script>
</body>
</html>
HTML部分代码
```
上传文件:
```html
<input type="file" id="f1">
<button id="b1">上传</button>
$('#b1').click(function () {
var formobj = new FormData();
formobj.append('file',document.getElementById('f1').files[0]); /*前端里元素的获取*/
// formobj.append('file',$('#f1')[0].files[0]);
formobj.append('name','alex');
$.ajax({
url: '/upload/',
type: 'post',
data:formobj ,
processData:false, //
contentType:false,
success: function (res) {
$("[name='i3']").val(res)
},
})
})
```
ajax通过csrf的校验
前提条件:确保有csrftoken的cookie
在页面中使用{% csrf_token %}
加装饰器 ensure_csrf_cookie
from django.views.decorators.csrf import csrf_exempt,csrf_protect, ensure_csrf_cookie
1.给data中添加csrfmiddlewaretoken的值
```html
data: {
'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val(),
a: $("[name='i1']").val(),
b: $("[name='i2']").val(),
},
```
2.加请求头
```html
headers:{
'x-csrftoken':$('[name="csrfmiddlewaretoken"]').val(),
},
```
###