如何在Django模板中使用sync_to_async() ?



我试图使Django教程代码轮询成异步与uvicorn异步视图。ORM查询通过在sync_to_async()中包装来处理async视图。

question = await sync_to_async(Question.objects.get, thread_sensitive=True)(pk=question_id)

但是我不知道如何在Django模板中应用sync_to_async或thread。

这段代码失败了,说'你不能从async上下文中调用这个-使用线程或sync_to_async。'或者有其他解决方法吗?

{% for choice in question.choice_set.all %}

我使用Python 3.10, Django 4.0.4和uvicorn 0.17.6

我找到了几个解决方案:

不安全。在settings.py中添加:

import os
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"

或者在单独的函数中获取你的Question对象:

@sync_to_async
def get_question(question_id):
return get_object_or_404(Question, pk=question_id)
question = await get_question(pk=question_id)

或者不拆分(适用于Django 4.1+):

question = await Question.objects.aget(id=question_id)