Проблема с контекстным процессором в async django
Мое приложение 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 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:
context = processor(self.request)
где processor
- фактическая функция контекстного процессора.
Я создал тему на форумах Django для обсуждения этого вопроса: https://forum.djangoproject.com/t/async-context-processors/27935