1

我尝试使用由 login_required 修饰的异步视图。
目前我在我的 urls.py 中装饰它

网址.py:

from . import views
from django.urls import path
from django.contrib.auth.decorators import login_required

urlpatterns = [
    path('', login_required(views.my_view), name='my_view'),
]

视图.py:

async def my_view(request):
return render(request, 'app/test.html', context={})

测试时我得到一个错误,这个视图将返回一个未等待的协程

等待渲染时,它告诉我不能等待 http 响应。

视图.py:

@async_to_sync
async def my_view(request):
return render(request, 'app/test.html', context={})

似乎工作,但
在我的理解@async_to_sync 应该把它同步,但执行它异步?

编辑:
没有 login_required @async_to_sync 似乎不是必需的,它可以工作。

正确的方法是什么?

4

2 回答 2

1

您可能需要编写login_required装饰器的异步感知版本。

并不是说它目前对你有多大帮助,我敢打赌:如果你使用默认的身份验证后端,访问request.user将涉及数据库访问,它仍然是同步的。

于 2020-08-11T10:50:58.400 回答
0

您可能想要这样做:

@sync_to_async
@login_required
def my_view(request):
    ...

请注意,装饰器的顺序很重要

于 2022-02-23T14:17:18.093 回答