带有 login_required 装饰器的 Django 3.1 异步视图

Posted

技术标签:

【中文标题】带有 login_required 装饰器的 Django 3.1 异步视图【英文标题】:Django 3.1 async view with login_required decorator 【发布时间】:2020-12-01 00:18:10 【问题描述】:

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

urls.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'),
]

views.py:

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

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

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

views.py:

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

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

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

正确的做法是什么?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于带有 login_required 装饰器的 Django 3.1 异步视图的主要内容,如果未能解决你的问题,请参考以下文章

带有 AJAX 的 Django login_required 装饰器

默认解析器的身份验证/授权

django的权限认证:登录和退出。auth模块和@login_required装饰器

Python进阶装饰器(Decorator)

装饰 login_required Django 装饰器

装饰器login_required