Middleware 中间件

在网上找了许多讲解的,总感觉不如文档中的讲解一目了然。
翻译,修改一下,写下这篇博文。

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 后.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值