django自带7个中间件,支持自定义
在使用django开发项目的时候如果涉及到全局相关功能都可以使用中间件
1.用户身份校验
2.权限校验
3.访问频率校验
请求来的时候和走的时候都需要经过中间件
django支持自定义并且暴露5个可以自定义的方法:
掌握:
1.process_request
2.process_response
了解:
1.process_view
2.process_template_response
3.process_exception
- process_request(self,request)
- process_view(self, request, view_func, view_args, view_kwargs)
- process_template_response(self,request,response)
- process_exception(self, request, exception)
- process_response(self, request, response)
自定义中间件
1.在项目或应用下创建一个文件夹
2.文件夹内创建一个py文件
3.书写代码,且必须继承MiddlewareMixin
4.settings内配置路径才能生效 ``` from django.utils.deprecation import MiddlewareMixin
class Mymiddleware(MiddlewareMixin): def process_request(self,request): pass
def process_response(self,request,response):
return response
MIDDLEWARE = [ ‘django.middleware.security.SecurityMiddleware’, ‘django.contrib.sessions.middleware.SessionMiddleware’, ‘django.middleware.common.CommonMiddleware’, ‘django.middleware.csrf.CsrfViewMiddleware’, ‘django.contrib.auth.middleware.AuthenticationMiddleware’, ‘django.contrib.messages.middleware.MessageMiddleware’, ‘django.middleware.clickjacking.XFrameOptionsMiddleware’, ‘app01.mymiddleware.mymd.Mymiddleware’,#配置的路径 ]
process_request<br />请求来到时候会经过django中间件中的每一个该方法<br />执行顺序:配置文件中的顺序<br />如果返回了HttpResponse对象,则请求原路返回,不再继续往后
用来做全局相关的限制功能
process_response<br />执行顺序和process_request相反
如果在一个中间件中的process_request中直接返回了HttpResponse,则执行当前中间件下的process_response后直接返回
process_view<br />匹配路由成功之后,执行视图函数之前会自动执行
process_template_response<br />返回的HttpResponse有render属性才会触发<br />配置文件倒序执行
process_exception<br />视图函数中出现异常才会触发<br />配置文件倒序执行
<a name="M1RdS"></a>
##
<a name="0DXCM"></a>
## csrf跨站请求伪造
csrf内部原理<br />返回的时候附上唯一标识,用这个唯一标识来检验是否是跨站请求,只有标识对上了才能继续执行,否则403
form表单检验<br />在form表单内书写 {% csrf_token %}
ajax检验
利用模板语法
```
通用方式
```
#通用方式
{% load static %}
csrfjs.js
function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== ‘’) { var cookies = document.cookie.split(‘;’); for (var i = 0; i < cookies.length; 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; } var csrftoken = getCookie(‘csrftoken’); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); }
$.ajaxSetup({ beforeSend: function (xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader(“X-CSRFToken”, csrftoken); } } });
<a name="ElQGV"></a>
## csrf相关装饰器
from django.views.decorators.csrf import csrf_exempt,csrf_protect “”” csrf_exempt 取消校验 只有装饰dispatch才会生效 csrf_protect 需要校验 和CBV三种装饰器一样 “”” from django.utils.decorators import method_decorator from django.views import View
@method_decorator(csrf_protect,name=’post’)
class Mycsrf(View):
# @method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
return super(Mycsrf, self).dispatch(request,*args,**kwargs)
def get(self):
return HttpResponse('get请求')
# @method_decorator(csrf_protect)
def post(self):
return HttpResponse('POST请求')
```
