中间件支持同步和异步请求的任意组合。如果Django不能同时支持它们,它会调整请求来适应中间件的需求,但会有性能损失。
默认情况下,Django假设你的中间件只能处理同步请求。如果要改变这种模式,需要在你的中间件工厂函数或类中添加入如下属性:
sync_capable
是一个布尔值,来表明中间件是否处理同步请求。默认为 True
。async_capable
是一个布尔值,来表明中间件是否处理异步请求。默认为 False
。如果中间件的sync_capable = True
并且 async_capable = True
,那么Django 会将请求传递给它而不进行转换。在这种情况下,你可以使用 asyncio.iscoroutinefunction()
来检查传递的 get_response
是否是一个协同函数,从而确定中间件是否接收到异步请求。
django.utils.decorators
模块包含 sync_only_middleware()
,async_only_middleware()
和 sync_and_async_middleware()
装饰器,允许你将这些标志应用到中间件工厂函数中。
返回的可调用对象必须符合 get_response
方法的同步或异步性质。如果你有一个异步的 get_response
,你必须返回一个协程函数(async def
)。
process_view
、process_template_response
和 process_exception
方法,如果有的话,也应该进行调整以匹配同步/异步模式。然而,如果你不这样做,Django 会根据需要单独调整它们,但会有额外的性能损失。
下面以一个例子来说明如何创建一个支持这两种功能的中间件函数:
import asyncio
from django.utils.decorators import sync_and_async_middleware
@sync_and_async_middleware
def simple_middleware(get_response):
# One-time configuration and initialization goes here.
if asyncio.iscoroutinefunction(get_response):
async def middleware(request):
# Do something here!
response = await get_response(request)
return response
else:
def middleware(request):
# Do something here!
response = get_response(request)
return response
return middleware
注解:如果你声明了一个同时支持同步和异步调用的混合中间件,你得到的调用种类可能与底层视图不匹配。Django 会优化中间件调用栈,使其尽可能少的同步/异步转换。
因此,即使你包装的是一个异步视图,如果在你和视图之间有其他的、同步的中间件,你也可能会在同步模式下被调用。
跨数据库关系Django 当前不提供对跨多数据库的外键或多对多关系任何支持。如果已经使用路由来分隔模型到不同数据库,那么通过这...
因为大部分的标准 QuerySet 方法能直接从 Manager 访问,这个实例仅适用于你在自定义 QuerySet 中定义了额外方法,...
本教程从教程第 5 部分结束的地方开始。我们已经建立了一个经过测试的网络投票应用程序,现在我们将添加一个样式表和一个图像。...
Java Swing教程 -Java Swing JTextFieldJTextField可以处理一行纯文本。它的构造函数接受以下三个值的组合。A string - specifie...