django进阶05中间件
原创:django进阶05中间件
django进阶05中间件
什么是中间件
django的中间件(middleware)是一个轻量级的插件系统,在django中的请求和响应中,可以利用中间件干预视图的请求和响应。
如何启用中间件
若要启用中间件组件,请将其添加到 Django 配置文件settings.py的 MIDDLEWARE 配置项列表中。
五大钩子函数
传统方式自定义中间件其实就是在编写五大钩子函数:
1 2 3 4 5 |
process_request(self,request) process_response(self, request, response) process_view(self, request, view_func, view_args, view_kwargs) process_exception(self, request, exception) process_template_response(self,request,response) |
可以实现其中的任意一个或多个!
中间件的顺序问题
从上一部分可以看出,中间件是有多个的,既然有多个必然涉及到优先级或顺序问题,顺序大体上符合先来后到(不存在插队类型的优先级,要么正序,要么逆序,不能插队跳跃执行)
MIDDLEWARE 的顺序很重要,具有先后关系,因为有些中间件会依赖其他中间件。例如: AuthenticationMiddleware 需要在会话中间件中存储的经过身份验证的用户信息,因此它必须在 SessionMiddleware 后面运行 。
在请求阶段,调用视图之前,Django 按照定义的顺序执行中间件 MIDDLEWARE,自顶向下。
你可以把它想象成一个洋葱:每个中间件类都是一个“皮层”,它包裹起了洋葱的核心–实际业务视图。如果请求通过了洋葱的所有中间件层,一直到内核的视图,那么响应将在返回的过程中以相反的顺序再通过每个中间件层,最终返回给用户。
如果某个层的执行过程认为当前的请求应该被拒绝,或者发生了某些错误,导致短路,直接返回了一个响应,那么剩下的中间件以及核心的视图函数都不会被执行。
图上一部分标识错误了,已经标注出来(view的执行在路由后,view视图函数前)
更为详细的执行流
可以做什么
Cache:缓存中间件
如果启用了该中间件,Django会以CACHE_MIDDLEWARE_SECONDS 配置的参数进行全站级别的缓存。
Common:通用中间件
禁止DISALLOWED_USER_AGENTS中的用户代理访问服务器
自动为URL添加斜杠后缀和www前缀功能。如果配置项 APPEND_SLASH 为True ,并且访问的URL 没有斜杠后缀,在URLconf中没有匹配成功,将自动添加斜杠,然后再次匹配,如果匹配成功,就跳转到对应的url。 PREPEND_WWW 的功能类似。
为非流式响应设置Content-Length头部信息。
GZip:内容压缩中间件
用于减小响应体积,降低带宽压力,提高传输速度。
该中间件必须位于其它所有需要读写响应体内容的中间件之前。
Locale:本地化中间件
用于处理国际化和本地化,语言翻译。
Message:消息中间件
基于cookie或者会话的消息功能,比较常用。
Security:安全中间件
Site:站点框架。
这是一个很有用,但又被忽视的功能。
它可以让你的Django具备多站点支持的功能。
通过增加一个site属性,区分当前request请求访问的对应站点。
无需多个IP或域名,无需开启多个服务器,只需要一个site属性,就能搞定多站点服务。 `
Authentication:认证框架
Django最主要的中间件之一,提供用户认证服务。
CSRF protection:提供CSRF防御机制的中间件
X-Frame-Options:点击劫持防御中间件
可能遇到问题
全局异常object() takes no parameters
错误信息如下
1 2 3 4 5 |
# File "C:\python\lib\site-packages\django\core\handlers\wsgi.py", line 151, in __init__ # self.load_middleware() # File "C:\python\lib\site-packages\django\core\handlers\base.py", line 82, in load_middleware # mw_instance = middleware(handler) # TypeError: object() takes no parameters |
出错原始代码:
1 2 3 4 |
# from django.http import HttpResponse # class MyException(object): # def process_exception(request,response, exception): # return HttpResponse(exception.message) |
正确代码1:
1 2 3 4 5 6 7 8 9 |
# class MyException(object): # def __init__(self, get_response): # self.get_response = get_response # # def __call__(self, request): # return self.get_response(request) # # def process_exception(self, request, exception): # return HttpResponse(exception) |
正确代码2
1 2 3 4 5 6 |
from django.http import HttpResponse from django.utils.deprecation import MiddlewareMixinclass MyException(MiddlewareMixin):def process_exception(self, request, exception):return HttpResponse(exception) |
兼容 Django新版本和旧版本
1 2 3 4 5 6 7 8 9 10 11 |
try:from django.utils.deprecation import MiddlewareMixin # Django 1.10.x except ImportError:MiddlewareMixin = object # Django 1.4.x - Django 1.9.xclass SimpleMiddleware(MiddlewareMixin):def process_request(self, request):passdef process_response(request, response):pass |
参考
Django(十二):Django框架中的middleware中间件:https://blog.csdn.net/qq_40558166/article/details/102467833
Django框架全面讲解 – 中间件(MiddleWare):https://blog.csdn.net/shentong1/article/details/78829599
Django 中间件:https://www.runoob.com/django/django-middleware.html
Django之Middleware(中间件):https://www.cnblogs.com/Alexephor/p/11272839.html
Django中间件:https://www.liujiangblog.com/blog/45/
Django 中间件:https://code.ziqiangxuetang.com/django/django-middleware.html
Python Django,中间件,中间件函数,全局异常处理:https://blog.csdn.net/houyanhua1/article/details/85028983
django全局异常捕获保存和输出,logger配置:https://hhyo.github.io/2018/04/16/django-traceback/
django中间件修改,以及TypeError: object() takes no parameters的异常处理:https://my.oschina.net/u/4374968/blog/3899317
django进阶05中间件相关推荐
- Django进阶之中间件
中间件简介 在http请求 到达视图函数之前 和视图函数return之后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 中间件的执行流程 1.执行完所有的request方法 到 ...
- Django进阶教程
Django进阶教程 Queryset特性及高级查询技巧 什么是QuerySet QuerySet是Django提供的强大的数据库接口(API).正是因为通过它,我们可以使用filter, exclu ...
- 【django】自定义中间件
一. ⾃定义中间件 1.Django中的中间件是⼀个轻量级.底层的插件系统,可以介⼊Django的请求和响应处理过程,修改Django的输⼊或输出.中间件的设计为开发者提供了⼀种⽆侵⼊式的开发⽅式,增 ...
- pythonos pathjson_python进阶05 常用问题库(1)json os os.path模块
python进阶05 常用问题库(1)json os os.path模块 一.json模块(数据交互) web开发和爬虫开发都离不开数据交互,web开发是做网站后台的,要跟网站前端进行数据交互 1.什 ...
- django框架之中间件 Auth模块
CBV加装饰器 方式一:装饰器加到想装饰的方法上 方式二:装饰器加到class前面,通过name参数指定被装饰的方法 方式三:重写dispatch(django分发CBV视图函数),直接给dispat ...
- Django基础之中间件
一:中间件 中间件:django 中的中间件(middleware),在django中,就是一个类.在请求来和结束后,Django会根据自己的规则在合适的时机执行中间件的相应方法: 应用:对所有请求或 ...
- django进阶07用户模块与权限系统
原创:django进阶07用户模块与权限系统 Django默认提供了用户权限管理模块auth, 1 2 3 user表,User是auth模块中维护用户信息的表,在数据库中该表被命名为auth_use ...
- django进阶06数据库事务
原创:django进阶06数据库事务 锁 1.1:乐观锁: 概念:同一条数据很少会因为并发修改而产生冲突,适用于读多写少的场景. 实现方式:读取一个字段,执行处理逻辑,当需要更新数据时,再次检查该字段 ...
- django进阶04部署上线(nginx,uwsgi,supervisor)
原创博文地址:django进阶04部署上线(nginx,uwsgi,supervisor) django自身服务ok python manage.py runserver,验证可正常访问 uwsgi安 ...
最新文章
- 2022-2028年中国自动化设备市场研究及前瞻分析报告
- 安卓之上传文件,即HTTP提交表单
- debian安装搜狗
- 华为 云 虚拟服务器,华为虚拟服务器设置
- jzoj3844-统计损失【树形dp,换根法】
- mysql-表完整性约束
- php socket keepalive,linux keepalive探测对应用层socket api的影响
- django 1.8 官方文档翻译:14-1 按需内容处理
- 电导增量法matlab,基于变步长电导增量法MPPT研究.doc
- WebServer起不来,如何查看原因
- 你还在烦U盘记录该如何消除吗
- Android多进程之Binder的意外死亡及权限校验
- ubuntu14安卓phalcon
- Linux系统的关机重启命令
- windows性能监视器API
- 科学计算机r系数的操作,R语言实现Fleiss’ Kappa系数处理多个观察者一致性检验...
- python 网络编程模块_详细介绍Python网络编程模块
- 使用 paddlehub的人物识别 对游戏人物识别 绘制方框
- SpringBoot接入Ueditor编辑器
- 第四次面试----华数电力科技有限公司
热门文章
- 【定义+用法+区别+使用场景】escape(),encodeURI(),encodeURIComponent()
- Power BI Desktop交互式和弦图
- azure云数据库_保护Azure SQL数据库免于意外删除
- SQL Server数据库连续集成(CI)最佳实践以及如何实现它们–测试,处理和自动化
- ssis 有条件拆分_SSIS条件拆分转换概述
- js将手机号中间四位变成*号
- bzoj5406: Gift
- 2018-11-13#Hive外表创建和加载数据
- 【洛谷2926/BZOJ1607】[USACO08DEC]Patting Heads拍头(筛法)
- 云服务器装teamviewer