【问题标题】:Running django with ASGI?用 ASGI 运行 django?
【发布时间】:2021-09-27 09:57:19
【问题描述】:

当我使用以下方式运行应用程序时:

gunicorn --log-level debug --workers 3 myapp.asgi:application --worker-class uvicorn.workers.UvicornWorker

我看到了警告

ASGI 'lifespan' protocol appears unsupported.
  1. 在阅读here 后我了解django 不支持,但这对我的应用程序有影响吗?或者效果应该在哪里?
  2. 我的应用正在使用同步端点,例如:
class MyViewSet(viewsets.ModelViewSet):
    queryset = My.objects.all()
    serializer_class = MySerializer

通过使用 ASGI 运行,对数据库的调用将是异步的吗?

  • 我不使用任何网络套接字
  1. 我可以在网上看到 asgi.py 文件的多个版本,其中包含许多不同的中间件和 django.setup() 关键字,我在哪里可以找到有关用例的文档?

【问题讨论】:

  • 最好在一篇文章中提出一个问题... Lifespan 只是一个事件,所以,就像应用程序启动时,它会知道,重新启动,然后它只会知道。

标签: django asgi


【解决方案1】:
exec envdir .envdir gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --timeout 300 \
  --workers $NUM_WORKERS \
  --bind=unix:$SOCKFILE \
  --preload \
  -k uvicorn.workers.UvicornWorker

【讨论】:

  • 它是如何回答问题的?你能详细说明一下吗?
  • 如果您提供解释为什么这是首选解决方案并解释它是如何工作的,它会更有帮助。我们想要教育,而不仅仅是提供代码。
【解决方案2】:
  1. 我认为lifespan 功能似乎不应该阻止任何未使用该功能的 Django 应用程序。

  2. 如果您在视图中使用同步代码,那么切换到 ASGI 不会神奇地使您的视图异步。您需要围绕它的异步包装器。查看Django docs 关于适配器sync_to_async()async_to_sync()

  3. 我从未见过django.setup() 的用法。我不完全理解你的问题。 asgi.py 文件应该是这样的:

import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'MyService.settings.local')
application = get_asgi_application()

不过,就个人而言,在设置完这一切之后,我的观点仍然是同步的。我已经打开了这个问题:Uvicorn async workers are still working synchronously

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-08
    • 2020-04-19
    • 1970-01-01
    • 2020-08-07
    • 2022-08-12
    • 1970-01-01
    • 2016-09-03
    • 2018-12-28
    相关资源
    最近更新 更多