>[success] # Django 中间件
~~~
所有的请求,先到中间插件过滤,过滤后进行url匹配,到对应的view方法,response返回给中间插件,中间插件层层返回给用户。根据这个描述我们可以画个图
~~~
![](https://box.kancloud.cn/0941286c3eac854b1c38adf6b50c8b62_583x309.png)
* setting 中的图
![](https://box.kancloud.cn/2e65d9d1a5839f1b4b124408b5b4924c_643x283.png)
>[success] # 如何配置
>[danger] ##### 创建目录
![](https://box.kancloud.cn/73f948016c8d31c6eeb9f60a18b0e16d_250x111.png)
* * * * *
<br>
>[danger] ##### 导入中间件
![](https://box.kancloud.cn/6ef3dcc174ceeb3d95befac736166a21_591x260.png)
>[danger] ##### 编写中间件
~~~
1.知识点from django.utils.deprecation import MiddlewareMixin继承类
2.接受请求的方法名process_request()
3.返回响应的方法名process_response()
4.参数reuqest等同于view中的request
~~~
* 代码案例
~~~
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class test1(MiddlewareMixin):
def process_request(self,request):
print("1号请求")
def process_response(self,request,response):
print("1号响应")
return response
class test2(MiddlewareMixin):
def process_request(self, request):
print("2号请求")
def process_response(self, request, response):
print("2号响应")
return response
~~~
* 打印结果
~~~
1号请求
2号请求
view响应
2号响应
1号响应
~~~
>[danger] ##### 发现条件不满足时
![](https://box.kancloud.cn/26899d37b3683b877ba7ff07243f1083_603x287.png)
当第一个过滤器发现已经不满足,过滤筛选项时,可以利用HttpResponse,直接不经过views层
~~~
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class first(MiddlewareMixin):
def process_request(self,request):
print(request.META['REMOTE_ADDR'])
return HttpResponse('你没有权限')
def process_response(self,request,response):
print("1号响应")
return response
~~~
>[success] # 参数流程
>[danger] ##### 统计模板运行时间
func 代指运行函数
~~~
from django.utils.deprecation import MiddlewareMixin
from django.urls import reverse
class TimeItMiddleware(MiddlewareMixin):
def process_request(self, request):
return
def process_view(self, request, func, *args, **kwargs):
if request.path != reverse('index'):
return None
start = time.time()
response = func(request)
costed = time.time() - start
print('{:.2f}s'.format(costed))
return response
def process_exception(self, request, exception):
pass
def process_template_response(self, request, response):
return response
def process_response(self, request, response):
return response
~~~
>[danger] ##### process_request
~~~
一个请求来到middelware层,进入的第一个方法。一般情况我们可以在这里做一
些校验,比如用户登录,或者HTTP中是否有认证头之类的验证。这个方法需要两
种返回值,HttpResponse或者None,如果返回HttpResponse,那么接下来的
处理方法只会执行process_response,其他的方法将不会被执行。这里需要注意
的是,如果你的middleware在settings配置的MIDDLEWARE_CLASS的第一个的
话,那么剩下的middleware也不会被执行。另外一个返回值是None,如果返回
None,那么Django会继续执行其他的方法。
~~~
>[danger] ##### process_view
~~~
这个方法是在process_request之后执行的,参数如上面代码所示,其中的func
就是我们将要执行的view方法,因此我们要统计一个view的执行时间,可以在这
里来做。它的返回值跟process_request一样,HttpResponse/None,逻辑也是
一样。如果返回None,那么Django会帮你执行view函数,从而得到最终的
Response。
~~~
>[danger] ##### process_template_response
~~~
执行完上面的方法,并且Django帮忙我们执行完view之后,拿到最终的
response,如果是使用了模板的Response(是指通过return render(request,
'index.html', context={})的方式返回Response,就会来到这个方法中。这个方
法中我们可以对response做一下操作,比如Content-Type设置,或者其他
HEADER的修改/增加。
~~~
>[danger] ##### process_response
~~~
当所有流程都处理完毕,就来到了这个方法,这个方法的逻辑跟
process_template_response是完全一样的。只是process_template_response
是针对带有模板的response的处理。
~~~
>[danger] ##### process_exception
~~~
上面的所有处理方法是按顺序介绍的,而这个不太一样。只有在发生异常时,才
会进入到这个方法。哪个阶段发生的异常呢?可以简单的理解为在将要调用的
view中出现异常(就是在process_view的func函数中)或者返回的模板
Response在render时发生的异常,会进入到这个方法中。但是需要注意的是,
如果你在process_view中手动调用了func,就像我们上面做的那样,那就不会触
发process_exception了。这个方法接收到异常之后,可以选择处理异常,然后
返回一个含有异常信息的HttpResponse,或者直接返回None,不处理,这种情
况Django会使用自己的异常模板。
~~~
- 网络原理
- 为搭建框架做准备
- 简单认识网路
- 自定义模拟网站案例
- 优化最终框架
- 数据存储 -- data
- 用户个人信息存储 -- User.txt
- 路由映射 -- routes
- 处理用户信息 -- routes_static.py
- 保存静态文件 -- static
- templates -- html 集中处理模块
- 首页 -- index.html
- 登陆 -- login.html
- 用户注册页面 -- register
- 日志模块 -- log.gua.txt
- 启动文件--server.py
- orm处理 -- model.py
- 日志模块 -- utils.py
- 两种数据库类型
- 传统数据库了解篇
- 前端快速入门
- JS简单使用入门
- css简单快速入门
- DJANGO
- virtualenv-创建虚拟环境
- 项目结构
- django-admin中文配置
- django-打印sql语句
- django-基础
- 认识MVC和MTV
- Django--初识
- Django--初识案例
- Django-FBV/CBV
- Django--常用input 交互
- Django-url
- Django-url.py 配置
- Django-include 使用
- Django-url name
- Django-ORM
- ORM-数据库配置
- ORM-model字段
- ORM-model字段解释
- ORM-字段选项
- ORM-查询
- ORM-四种常用查询方法
- ORM-三种获取数据
- ORM-其他查询方式
- ORM-条件查询双线
- ORM-Q和F条件使用
- ORM-三种数据库交互
- 案例 -- 一对多
- ORM-技巧/常见问题
- ORM-N+1 问题
- ORM-并发的处理
- ORM-数量查询、
- ORM-正向反向查询
- ORM-基础案例一
- ORM-基础一对多案例
- Django-templates
- Django-模板的继承
- Django-模板的过滤
- Django-自定义模板的过滤
- Django-cookie
- Django-cookies 装饰器
- Djang-session
- Django-CSRF
- Django-中间件 -- 后续了解
- Django- 缓存 -- 没有深入了解
- Django-form
- From-ajax
- form-内部验证处理
- form-属性
- form-常用的标签字段
- form-常用的下拉和选择
- form-widget速查
- Django-ajax序列化
- Django-多种ajax写法
- ajax-原生写法
- ajax-$写法
- ajax-ifram
- Django-ajax图片上传
- ajax-原始写法
- ajax-正常写法
- iframe+form
- 实战写法
- Django-常用自编写组件
- Django-双菜单组合搜索
- Django - 多菜单组合搜索
- Django-分页
- django-综合基础
- 综合基础-render
- django-admin
- admin-页面配置
- admin-字段配置
- admin-编辑页面
- admin-forms验证
- admin-创建抽象类
- django-验证码
- 验证码-第三方生成库
- 验证码-view.py使用
- 验证码-注意引入Monaco.ttf
- django-用户注册
- 注册-form 模块
- 注册-views 模块
- 注册-html模块
- 注册-model模块
- django-用户登录三种
- session登录
- form-session 写法
- view-写法
- Html-写法
- model-写法
- 继承类登录
- 外键关联登录
- django-简单的student 管理案例
- app-urls.py
- app-models.py配置
- admin-admin.py配置
- app-form.py 和数据库关联的写法
- app-FBV_views.py
- app-CBV_views.py
- templates-index.html
- django-博客系统
- APP目录-models.py 创建
- APP目录-基础展示数据分析
- APP目录-基础数据展示cls
- ListView
- DetailView
- FormView
- 额外功能拓建
- 添加文章搜索/用户文章查询功能
- 增加一个友情链接
- 增加一个评论模块
- App-利用Bootstrap4 搭建样式
- 项目crm
- 思维导图
- perfectCRM-项目名字
- settings.py-配置
- view.py-登陆/登出函数
- crm-app文件
- model.py-表的创建
- admin.py-注册后台
- view.py-视图层
- static-静态文件
- css
- bootstrap.min.css
- dashboard.css
- ie10-viewport-bug-workaround.css
- signin.css
- fonts
- imgs
- js
- jquery.js
- bootstrap.min.js
- holeder.js
- ie10-viewport-bug-workaround.js
- ie-emulation-modes-warning.js
- plugins
- html模板文件-templates
- crm
- index.html-首页模板