首页 > 解决方案 > 为什么不使用sync_to_async就不能使用AsyncClient登录?

问题描述

根据有关在 Django 3.1 中测试异步函数的文档,应该可以在异步上下文中简单地等待异步客户端方法,而无需将其包装sync_to_asyncdatabase_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)

标签: djangopython-asynciodjango-channels

解决方案


首先,您得到的是响应,而不是请求。

评估为真的将是response.ok.

但是,async_client.login 不是异步方法,不发送请求,与 force_login 相同。它们只是伪造与登录用户的会话并且是同步的(如果您的 SESSION_STORE 是 ModelBackend,则具有数据库访问权限)。


推荐阅读