异步 django 中的上下文处理器问题

问题描述 投票:0回答:1

我的 django 应用程序具有以下功能:

  1. 具有异步方法的模型。
  2. 异步视图。
  3. 从模型调用异步方法并从视图修改响应上下文的上下文处理器。

我使用 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 异步支持是否还没有达到可以提供与同步相同功能的程度?

python django asynchronous
1个回答
0
投票

我今天遇到了同样的问题,你是对的:上下文处理器不支持异步(还!)。

我相信正是这一行需要异步感知:

https://github.com/django/django/blob/b47bdb4cd9149ee2a39bf1cc9996a36a940bd7d9/django/template/context.py#L254C23-L254C32

context = processor(self.request)
其中
processor
是实际的上下文处理器函数。

我在 Django 论坛上创建了一个线程来讨论这个问题:https://forum.djangoproject.com/t/async-context-processors/27935

© www.soinside.com 2019 - 2024. All rights reserved.