Django------csrf,ajax笔记

### 1.csrf装饰器 ``` from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie csrf_exempt 某个视图不需要进行csrf校验 csrf_protect 某个视图需要进行csrf校验 ensure_csrf_cookie 确保生成csrf的cookie ``` ### 2.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的值,比较成功接收请求,比较不成功拒绝请求。 ### 3.ajax #### 1.发请求的方式 1.地址栏输入地址 GET 2.form表单 GET/POST 3.a标签 GET #### 2.ajax 就是使用js的技术发请求和接收响应的。 特点: 1. 异步 2. 局部刷新 3. 传输的数据量少 #### 3.jqery发ajax请求 ``` $.ajax({ url: '/calc/', type: 'post', data: { a: $("[name='i1']").val(), b: $("[name='i2']").val(), }, success: function (res) { $("[name='i3']").val(res) }, error:function (error) { console.log(error) } }) ``` #### 4.上传文件: ```html $('#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) }, }) }) ``` #### 5.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(), }, ``` 3.使用文件 同方式2

猜你喜欢

转载自www.cnblogs.com/anthony-wang0228/p/11096990.html