我的 django 应用程序具有以下功能:
我使用 Django 5.0 和 python 3.12,daphne 作为 asgi 服务器。
我的问题是什么: 到目前为止,django 似乎并不区分同步和异步上下文处理器。来自 django 源码 (
django/template/context.py
):
updates = {}
for processor in processors:
context = processor(self.request)
print(f"Context processor {processor.__qualname__}")
try:
updates.update(context)
except TypeError as e:
raise TypeError(
f"Context processor {processor.__qualname__} didn't return a " "dictionary."
) from e
因此,如果上下文处理器是异步的,django 内部只会尝试使用协程更新响应上下文并导致
Context processor ... didn't return a dictionary.
异常。
因此,我尝试通过使用
asgiref.sync.async_to_sync
包装对异步模型方法的调用来使上下文处理器同步。
无论设置 force_new_loop
参数,我都会遇到 You cannot use AsyncToSync in the same thread as an async event loop - just await the async function directly.
异常。
我是否遗漏了一些东西,或者 django 异步支持是否还没有达到可以提供与同步相同功能的程度?
我今天遇到了同样的问题,你是对的:上下文处理器不支持异步(还!)。
我相信正是这一行需要异步感知:
context = processor(self.request)
其中 processor
是实际的上下文处理器函数。
我在 Django 论坛上创建了一个线程来讨论这个问题:https://forum.djangoproject.com/t/async-context-processors/27935