执行时机:如果在执行过程中出现问题,并且抛出一个未被捕获的异常时才被调用 。我们可以用它来捕获请求错误,发送通知或者恢复错误场景 。
如果返回None,Django将使用框架内置异常处理,并继续交给下一个exception函数;如果返回HttpResponse对象,Django将不再执行其他除process_response以外的所有函数,并中断异常处理 。
执行时机:执行完view函数并生成response之后,几乎是必执行的函数 。
返回并且只能、必须返回HttpResponse对象,否则会导致HTTP请求中断 。
- 创建中间件类
from django.utils.deprecation import MiddlewareMixinclass MyCustomMiddleware1(MiddlewareMixin): def process_request(self, request): print('MyCustomMiddleware1') def process_response(self, request, response): print('返回 MyCustomMiddleware1') return responseclass MyCustomMiddleware2(MiddlewareMixin): def process_request(self, request): print('MyCustomMiddleware2') def process_response(self, request, response): print('返回 MyCustomMiddleware2') 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', 'MyMiddleware.MyCustomMiddleware1', 'MyMiddleware.MyCustomMiddleware2']输出结果:MyCustomMiddleware1MyCustomMiddleware2返回 MyCustomMiddleware2返回 MyCustomMiddleware1系统中间件的用途- django.middleware.security.SecurityMiddleware主要是针对安全访问处理,就是把http请求重定向到https请求
- django.contrib.sessions.middleware.SessionMiddleware在Django中我们用的request.session就是在process_request中进行处理的,根据我们在settings中配置的SESSION_COOKIE_NAME变量,从cookies中获取对应的值,从表中查询出session值,创建session对象,赋值给request_session对象 。
def process_request(self, request): session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME) request.session = self.SessionStore(session_key)在process_response函数中,给response对象设置SESSION_COOKIE_NAME值和过期时间等 。response.set_cookie( settings.SESSION_COOKIE_NAME, request.session.session_key, max_age=max_age, expires=expires, domain=settings.SESSION_COOKIE_DOMAIN, path=settings.SESSION_COOKIE_PATH, secure=settings.SESSION_COOKIE_SECURE or None, httponly=settings.SESSION_COOKIE_HTTPONLY or None, samesite=settings.SESSION_COOKIE_SAMESITE)- django.middleware.common.CommonMiddleware
检测是否允许浏览器类型
if 'HTTP_USER_AGENT' in request.META: for user_agent_regex in settings.DISALLOWED_USER_AGENTS: if user_agent_regex.search(request.META['HTTP_USER_AGENT']): raise PermissionDenied('Forbidden user agent')检查是否需要添加/,主要是根据settings中AppEND_SLASH配置if self.should_redirect_with_slash(request): path = self.get_full_path_with_slash(request)else: path = request.get_full_path()在process_response函数中,会判断是否需要把404的请求重新定向到我们需要的页面- django.middleware.csrf.CsrfViewMiddleware
这个很明显就是我们Django框架的csrf验证了,主要是process_view中的处理,从函数处理我们可以看到以下几点:
推荐阅读
- 人的寿命与睡觉方式息息相关?古人说的是哪“三觉”?看完涨知识
- 看完这篇Nginx介绍,你也可以配置属于自己的网站
- 用手挖鼻孔?看完这些你该后悔一整年
- 看完此文章若你还不能完美的入门Python,我将永远退出IT界
- CDN与缓存全面详聊,看完之后,大部分程序员收藏了
- 家庭炒菜时用白醋还是陈醋?看完后明白了,原来差别这么大
- RabbitMQ 使用指南
- 读《幻城》有感 幻城读后感
- MySQL 数据库使用
- 家里退休老人去世了,按照规定有5笔钱可领,看完记得转告家人
