【问题标题】:Correct way to use async class based views in Django在 Django 中使用基于异步类的视图的正确方法
【发布时间】:2023-04-08 03:03:02
【问题描述】:

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

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

Django 3.1 Development Documents

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

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

【问题讨论】:

标签: django async-await python-asyncio


【解决方案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不能在“等待”表达式中使用我不知道如何解决这个问题。你能帮我解决这个问题吗?提前致谢。
猜你喜欢
  • 1970-01-01
  • 2019-05-29
  • 2015-12-04
  • 2022-07-02
  • 2015-12-02
  • 2012-03-22
  • 2012-08-15
  • 1970-01-01
  • 2016-05-20
相关资源
最近更新 更多