Middleware 中间件
来源:互联网 发布:网络于柚子是什么意思 编辑:程序博客网 时间:2024/05/16 12:05
在网上找了许多讲解的,总感觉不如文档中的讲解一目了然。
翻译,修改一下,写下这篇博文。
Middleware
Middleware 可以理解为是一个处理Django框架请求/响应处理的钩子。
且这是一个轻量,低级别的“插件”系统
用于全局范围内改变Django框架的输入或输出
每一个middleware 组成元件都是一些有特殊用途的函数
例如:
中间件:AuthenticationMiddleware
它能通过session 使 用户和请求(request)联系起来
下面这个文档解释了middleware 怎么工作,如何启用,如何实现一个自己的middleware
Django附带一些内置的中间件,你可以直接使用。
它们被记录在内置的中间件参考中。
- Changed in Django 1.10:
- 引入了一种新的中间件,用于新的MIDDLEWARE设置。
如果您使用的是旧的MIDDLEWARE_CLASSES设置,则需要在使用新设置之前调整旧的自定义中间件。
Writing a your own middleware
middleware factory 可以通过调用 get_response 并返回一个中间件
middleware可以接受一个request并返回一个response,像一个view(视图函数)一样。
A middleware can be written as a function that looks like this:
def simple_middleware(get_response): # One-time configuration and initialization(一次性设置和初始化). #内置函数 def middleware(request): # Code to be executed for each request before # 代码要在每个request之前执行 # the view (and later middleware) are called. # view(视图函数)和在在此之后使用的middleware可以被调用 response = get_response(request) # Code to be executed for each request/response after # 每个request或者response之后执行 # the view is called. # view可以被调用 return response return middleware
或者可以写一个具有自我实例调用的类
class SimpleMiddleware(object): def __init__(self, get_response): self.get_response = get_response # One-time configuration and initialization. def __call__(self, request): # Code to be executed for each request before # the view (and later middleware) are called. response = self.get_response(request) # Code to be executed for each request/response after # the view is called. return response
get_response可以是一个view函数,也可以是 处理链 中另一个middleware
而 middleware 并不会确认它是什么,只会根据它指向下一步要到哪里执行
The above is a slight simplification – the get_response callable for the last middleware in the chain won’t be the actual view but rather a wrapper method from the handler which takes care of applying view middleware, calling the view with appropriate URL arguments, and applying template-response and exception middleware.
以上实例只是一个小小的简化 处理链中最后一个中间件的 get_response,
get_response这个middleware 将不再调用实际的view视图函数,而是用来处理 一些包装view 的方法
这些方法负责应用视图middleware,调用适当的URL参数 , 调用视图, 模板响应和异常middleware。
Middleware无处不在
init(get_response)
Middleware factories 一定要有一个get_response参数
你也可以为Middleware的初始化设置一些全局属性
同时存在以下警告:
Django 只使用get_response来初始化你的middleware ,所以你不能给
__init__()
设置其他参数.
不同于__call__()
函数每次request都要调用一次,__init__()
只在web服务启动时调用一次,之后不在调用
Changed in Django 1.10:
在这个版本中,
__init__()
直到Web服务器响应其第一个请求才被调用。在一些更老的版本中,
__init__()
不能接受任何参数
为了让您的 middleware 在Django 1.9及更早版本中使用,请将get_response设置为可选参数(get_response = None)。
将中间件标记为未使用
有时在启动时不确定是否应该使用一个中间件。
在这些情况下,您的中间件的init ()方法可能会引发MiddlewareNotUsed。 然后,Django将从middleware进程中移除该middleware,并在DEBUG为True时将调试消息记录到django.request记录器。
激活 middleware
想要激活middleware组件, 需要添加MIDDLEWARE list到django 的 setting.py 配置文件中
在MIDDLEWARE list 中 每个组件都用一个字符串表示 :
到 middleware factory这个类完整的项目路径(字符串) 或者 middleware函数名.
例,这里有一个默认的 django-admin startproject:
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',]
Django安装不需要任何middleware - 如果你喜欢 ,MIDDLEWARE可以是空的,— 但是 强烈建议使用CommonMiddleware.
MIDDLEWARE 很重要,对命令性 依赖性很强
例如 , AuthenticationMiddleware(认证middleware) 将认证的 用户 储存在session ; 因此, 他必须运行在 SessionMiddleware 后.
- 中间件 Middleware
- 中间件 Middleware
- Middleware 中间件
- 关于中间件(MiddleWare)
- 中间件 (Middleware)
- Middleware【中间件】简介
- 中间件(middleware)技术概括
- Django 中间件 Middleware
- .NET Core 中间件MiddleWare
- Spider 中间件(Middleware)
- Laravel Middleware 中间件
- Django-中间件Middleware
- Django middleware 中间件
- PHP中间件(middleware)解析
- redux的中间件(middleware)
- PHP中间件(middleware)解析
- Django教程笔记:六、中间件middleware
- grunt-contrib-connect 中间件middleware属性
- 学了2天的Python,自己写了个简单的爬虫,可是爬虫有什么用呢?
- Makefile的编写规则
- 【深入Java虚拟机】之一:Javac编译与JIT编译
- android 底部导航总结
- leetcode69---Sqrt(x)
- Middleware 中间件
- win7,win10右键添加“获取管理员的所有权限”的菜单
- 利用Python画小树和森林(宽度优先绘制+深度优先绘制)
- for 的用法
- 在Ubuntu系统中配置DHCP服务
- 安卓动画 补间动画
- jquery获取动态添加的标签对象
- C# mvc SignalR 即时推送
- 看了牛客网要发博客才好找工作,发篇冷静一下