我试图使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)