Django 中间件是一种可以插入 Django 项目请求/响应处理流程的框架。它允许开发者在不修改 Django 核心代码的情况下,对请求/响应进行额外的处理。它是一个非常有用的工具,可以用来实现认证、权限、会话、CSRF 保护和其他功能。
Django 中间件是一个 Python 类,它必须实现 process_request() 和 process_response() 方法。process_request() 方法在 Django 视图函数之前被调用,而 process_response() 方法则在视图函数之后被调用。这些方法都有一个 HttpRequest 对象作为参数,并返回一个 HttpResponse 对象。
class MyMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request) # Code to be executed for each request/response after the view is called. return response def process_view(self, request, view_func, view_args, view_kwargs): # Code to be executed for each request/response before the view is called. return None
中间件工厂是一个可调用的程序,它接受 get_response
可调用并返回中间件。中间件是可调用的,它接受请求并返回响应,就像视图一样。
中间件可以被写成这样的函数:
def simple_middleware(get_response):
# One-time configuration and initialization.
def middleware(request):
# Code to be executed for each request before
# the view (and later middleware) are called.
response = get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
return middleware
或者它可以写成一个类,它的实例是可调用的,如下:
class SimpleMiddleware:
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
Django 提供的 get_response
响应可能是实际视图(如果这是最后列出的中间件),或者它可能是链中的下一个中间件。不需要知道或关心当前的中间件到底是什么,它只是代表了下一步的内容。
以上是一个轻微的简化——链中最后一个中间件调用的 get_response
可不是实际视图,而是处理程序的包装方法,它负责应用 view middleware
,调用具有适当URL参数的视图,并应用 template-response
和 exception
中间件。
中间件可以只支持同步Python(默认),或异步Python,或者二者都支持。
中间件可以放在 Python 路径上的任何地方。
中间件工厂必须接受 get_response
参数。还可以初始化中间件的一些全局状态。记住两个注意事项:
get_response
参数初始化您的中间件,因此不能定义 __init__()
,因为需要其他参数。__call__()
方法不同,__init__()
仅在 Web 服务器启动时调用一次。在启动时确定是否应该使用一个中间件有时是有用的。在这些情况下,您的中间件的 __init__()
方法可能会引发 MiddlewareNotUsed
。Django 将从中间件进程中删除该中间件,并将调试消息记录到 django.request
日志:设置 DEBUG
为 True
。
使用 QuerySet.values() 和 values_list()当你只想得到字典或列表的值,并且不需要 ORM 模型对象时,可以适当使用 values(...
Java Swing教程 -JFrame让我们从最简单的Swing程序开始。我们将使用JFrame(它是一个顶层容器)来创建我们的第一个应用程序。要创...
Java Swing教程 -Java Swing MDIMDI代表多文档接口。在MDI应用程序中,打开一个主窗口,并在主窗口中打开多个子窗口。在MDI应用...
Java Swing教程 -Java Swing菜单以下步骤描述如何为我们的应用程序创建添加菜单的过程。创建一个JMenuBar类的对象,并使用其setJ...
注意:适用版本:mybatis-plus-generator 3.5.1 及其以上版本,对历史版本不兼容!快速入门安装dependencygroupIdcom.baomidou/g...