django - 为什么不使用sync_to_async就不能使用AsyncClient登录?
问题描述
根据有关在 Django 3.1 中测试异步函数的文档,应该可以在异步上下文中简单地等待异步客户端方法,而无需将其包装sync_to_async
或database_sync_to_async
实现所有方法。有没有解决的办法?
第一个请求有效,但第二个和第三个无效。
class TestAsyncClient(TransactionTestCase):
def setUp(self):
self.async_client = AsyncClient()
self.user = get_user_model().objects.create_user("user_a@example.com", "passwd_a")
async def test_async_login(self):
"""Use the async client to login without using sync_to_async"""
request = await self.async_client.get("/")
self.assertTrue(request)
logged_in = await self.async_client.login(
username="user_a@example.com", password="passwd_a"
)
self.assertTrue(logged_in)
logged_in = await self.async_client.force_login(self.user)
self.assertTrue(logged_in)
解决方案
首先,您得到的是响应,而不是请求。
评估为真的将是response.ok
.
但是,async_client.login 不是异步方法,不发送请求,与 force_login 相同。它们只是伪造与登录用户的会话并且是同步的(如果您的 SESSION_STORE 是 ModelBackend,则具有数据库访问权限)。
推荐阅读
- python - 如何使用 for 循环手动将对象添加到 Django 模型?
- android - 跨行动态拉伸表格单元格以适应其内容
- java - 如何修复我的应用程序崩溃而不是拨打电话?
- asp.net - 你可以在 ASP 中堆叠多个 IF 语句吗?我的不工作
- highcharts - 显示多行系列时,Highcharts单击事件未触发
- python-3.x - 如何在 Python 3.x 中使用 for 循环来解决这个难题?
- android - 2 orderby 方法在 firebase firestore android 上无法正常工作
- ruby-on-rails - 如何以相同的形式更新表及其关联的联接表?
- sql - 如何在 go-pg 中查询嵌套结构中的子字段(带有 Go 的 Postgres ORM)?
- python - 在 keras 中实现变分自动编码器时出现 InvalidArgumentError