Проблема с контекстным процессором в async django

Мое приложение 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 internals просто попытается обновить контекст ответа с помощью coroutine и вызовет Context processor ... didn't return a dictionary. исключение.

Итак, я попытался сделать свой контекстный процессор синхронным, обернув вызов метода модели async с помощью 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 async еще не достигла того уровня, когда она может обеспечить ту же функциональность, что и sync?

Я столкнулся с той же проблемой сегодня, и вы правы: контекстные процессоры не поддерживают async (пока!).

Я считаю, что именно эту строку нужно сделать async-aware:

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

Вернуться на верх