##Django中间件看完这篇彻底明白( 二 )
View函数:process_view(self, request, callback, callback_args, callback_kwargs)
执行时机:在执行完所有中间件的process_request函数 , 并且已经匹配到要执行的视图函数 , 但是还没有调用视图函数之前 。
callback:时机要执行的视图函数对象(就是我们所写的视图处理函数)
callback_args:视图函数的位置参数列表(不包含self和request)
callback_kwargs:视图函数的关键字参数
如果返回None , Django将继续处理下一个中间件的request函数;如果返回HttpResponse对象 , Django将不再执行其他除process_response以外的所有函数 , 包括后面的process_request函数、其他中间件函数以及视图函数 。
Template函数:process_template_response()
执行时机:只有在视图函数的返回对象中有render方法才会执行 , 并把render方法的返回值返回给用户 。
Exception函数:process_exception(self, request, exception)
执行时机:如果在执行过程中出现问题 , 并且抛出一个未被捕获的异常时才被调用 。我们可以用它来捕获请求错误 , 发送通知或者恢复错误场景 。
如果返回None , Django将使用框架内置异常处理 , 并继续交给下一个exception函数;如果返回HttpResponse对象 , Django将不再执行其他除process_response以外的所有函数 , 并中断异常处理 。
Response函数:process_response(self, request, response)
执行时机:执行完view函数并生成response之后 , 几乎是必执行的函数 。
返回并且只能、必须返回HttpResponse对象 , 否则会导致HTTP请求中断 。自定义中间件创建中间件类fromdjango.utils.deprecationimportMiddlewareMixin classMyCustomMiddleware1(MiddlewareMixin): defprocess_request(self,request): print('MyCustomMiddleware1') defprocess_response(self,request,response): print('返回MyCustomMiddleware1') returnresponse classMyCustomMiddleware2(MiddlewareMixin): defprocess_request(self,request): print('MyCustomMiddleware2') defprocess_response(self,request,response): print('返回MyCustomMiddleware2') returnresponse注册中间件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' ]
输出结果:MyCustomMiddleware1 MyCustomMiddleware2 返回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对象 。defprocess_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_SECUREorNone, httponly=settings.SESSION_COOKIE_HTTPONLYorNone, samesite=settings.SESSION_COOKIE_SAMESITE )django.middleware.common.CommonMiddleware 检测是否允许浏览器类型if'HTTP_USER_AGENT'inrequest.META: foruser_agent_regexinsettings.DISALLOWED_USER_AGENTS: ifuser_agent_regex.search(request.META['HTTP_USER_AGENT']): raisePermissionDenied('Forbiddenuseragent')
推荐阅读
- 「」哪家18W PD快充方案最受欢迎?看完这个报告秒懂
- 「」什么是基础架构即代码和平台即代码?看完就清楚了
- 5G:iPhone SE2 已开放预购,是否值得入手看完您看就明白
- []为什么有的人必须买苹果手机?三大原因看完就懂
- 『』传说中的iphoe se2终于发布,看完给你点要不要买的建议
- []笔记本处理器和独显谁更强?看完2张表你就懂了!
- 电脑爱好者@笔记本处理器和独显谁更强?看完2张表你就懂了!
- #来Get#为什么有的人必须买苹果手机?三大原因看完就懂
- 『Linux就该这么学』Linux PC System76推出Linux键盘 看完手痒了!
- 『数码俊说』一万元的神舟游戏本很贵吗?先看完它配置再说