在 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?