在 Django 中使用基于异步类的视图的正确方法

Posted

技术标签:

【中文标题】在 Django 中使用基于异步类的视图的正确方法【英文标题】:Correct way to use async class based views in Django 【发布时间】:2020-05-27 08:01:34 【问题描述】:

我正在尝试使用非常新的Django 3.1 Async 视图类。 根据可用的有限文档,我尝试创建自己的 async def __call__() 方法。 来自文件:

对于基于类的视图,这意味着将其__call__() 方法设为async def(而不是其__init__()as_view())。

Django 3.1 Development Documents

但是,直到现在我还没有编写基于异步类的视图。我经常收到await 异常,或者asyncio.iscoroutinefunction 返回False,如果该类实际上是异步的,我认为应该返回true。

由于文档缺少示例,有更多异步编程知识的人可以帮助我提供基于类的异步视图示例吗?

【问题讨论】:

你能发布一个你尝试过的代码示例吗? medium.com/@bruno.fosados/… 有没有可以看到异步__call__()方法的例子? 【参考方案1】:

花一些时间在 Django 票务系统、博文(感谢 Joren)等中进行搜索,这样您就不必这样做了。

你能做的最好的就是使用来自the blog的代码:

class YourView(View):    
@classonlymethod
def as_view(cls, **initkwargs):
    view = super().as_view(**initkwargs)
    view._is_coroutine = asyncio.coroutines._is_coroutine
    return view

async def get(self, *args, **kwargs):
    ...

但您还需要注意,您无法使用实际的泛型(没有异步 ORM 支持,甚至 TemplateView 也不起作用)和 3.1 的内置 decorators。您需要为 Django 通常自己做的事情编写自己的东西。

【讨论】:

当我用不同的方法(比如 PUT/POST)而不是引发 405 Method Not Allowed 调用 API 时,它响应为 500 - TypeError: object HttpResponseNotAllowed不能在“等待”表达式中使用我不知道如何解决这个问题。你能帮我解决这个问题吗?提前致谢。

以上是关于在 Django 中使用基于异步类的视图的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将参数传递给基于类的视图测试 Django Rest Framework?

Django:在基于类的视图中包含媒体(css/js)

如何响应 Django 基于类的视图中不允许的方法

从 Django 中基于类的通用视图自定义表单变量的首选方法是啥?

基于 Django 类的视图加载另一个带有数据的表单

django-基于类的视图