Tak*_*ada 5 python django asynchronous
我正在尝试使 Django 教程代码轮询与 uvicorn 异步视图异步。ORM 查询通过包装在sync_to_async() 中来与异步视图配合使用。
question = await sync_to_async(Question.objects.get, thread_sensitive=True)(pk=question_id)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在 Django 模板中应用sync_to_async 或线程。
此代码失败,提示“您无法从异步上下文中调用它 - 使用线程或sync_to_async。” 或者还有其他方法可以解决这个问题吗?
{% for choice in question.choice_set.all %}
Run Code Online (Sandbox Code Playgroud)
我使用 Python 3.10、Django 4.0.4 和 uvicorn 0.17.6
我为此找到了几种解决方案:
这不安全。在你的settings.py中添加:
import os
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
Run Code Online (Sandbox Code Playgroud)
或者在单独的函数中获取您的 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)
Run Code Online (Sandbox Code Playgroud)
或者不拆分(适用于 Django 4.1+):
question = await Question.objects.aget(id=question_id)
Run Code Online (Sandbox Code Playgroud)