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

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

Vit*_*nko 1

我为此找到了几种解决方案:

这不安全。在你的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)