【问题标题】:Do not wait for database result in async view in Django不要在 Django 中等待数据库结果出现在异步视图中
【发布时间】:2020-08-27 02:42:55
【问题描述】:

我在 Django 3.1 中有一个异步视图:

async def log_click(request):
    await sync_to_async(Click.objects.create)(author=request.user)
    return HttpResponse('<html>Clicked</html>')

是否可以通过不需要等待Click 实例的创建来提高此视图的性能?我尝试省略await 并使用asyncio.create_task

async def log_click(request):
    asyncio.create_task(sync_to_async(Click.objects.create)(author=request.user))
    return HttpResponse('<html>Clicked</html>')

但是在这种情况下,Click 实例根本没有被创建。我希望此视图尽快完成执行,但仍会创建 Click 实例。

【问题讨论】:

    标签: python-3.x django async-await django-views


    【解决方案1】:

    我的代码出错了。 asyncio.create_task() 是异步函数,因此需要await 语句:

    async def log_click(request):
        await asyncio.create_task(sync_to_async(Click.objects.create)(author=request.user))
        return HttpResponse('<html>Clicked</html>')
    

    【讨论】:

    • 我昨天在查看您的问题时确实尝试了类似的方法,但没有任何运气。请问您使用的是什么版本的python以及您使用什么本地服务器进行测试? (runserver 知道如何处理这个吗?)
    • @romaingz 我使用了 Python 3.8.5 和 Django 3.1。是的,我已经使用manage.py runserver 命令进行了测试,一切正常。我还使用django.test.TransactionTestCase 编写了一个工作测试。
    猜你喜欢
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多