【问题标题】:A Coroutine is returning a coroutine after await一个协程在等待之后返回一个协程
【发布时间】:2021-01-01 12:20:42
【问题描述】:

我正在使用 ASGI 服务器在 django 上为 fastAPI 编写测试(改编自 tutorial)。我的 fastAPI 方面的测试不断返回错误,我试图修复它是徒劳的。

我需要创建一个用户来测试 API。

@sync_to_async
def _create_user(self, username, email):
    try:
        return User.objects.create(username=username, email=email)
    except:
        return None

async def setUp(self):
    task = asyncio.create_task(self._create_user(username="user", email="email@email.com"))
    self.user = await task

运行这个测试,发现self.user 是一个协程,无法访问我期望的属性。

如何解决?

更新

删除了 _create_user(self, username, email) 的异步。

【问题讨论】:

  • 为什么要用sync_to_async 包装async 函数?为什么 _create_user async 首先是看到它除了错误地尝试 await print(..) 之外什么都不做异步?最后,为什么是setUpasync?这似乎根本不需要任何异步。您本质上是将同步操作 User.objects.create 包装到 async 的几个空层中,只是为了(错误地)解开空层然后运行同步代码。
  • 感谢您的帮助。有些事情我没有掌握很多。用 sync_to_async 包装 asyn 是出于调试目的,在发布我的问题之前我没有将其删除。我会更新我的问题。

标签: python django async-await fastapi


【解决方案1】:

根据文档https://docs.djangoproject.com/en/3.1/topics/async/#asgiref.sync.sync_to_async 装饰器 sync_to_async 应该装饰同步函数。 (见例子)

【讨论】:

  • 听起来不错。但我收到了这个警告RuntimeWarning: coroutine 'SyncToAsync.__call__' was never awaited self.setUp()
猜你喜欢
  • 2020-11-07
  • 2019-09-24
  • 1970-01-01
  • 2021-01-27
  • 2018-10-29
  • 2022-01-22
  • 2021-12-28
  • 1970-01-01
  • 2017-02-24
相关资源
最近更新 更多