使用ASGI运行Django?

4

当我使用以下命令运行该应用时:

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

我看到了警告

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

如果使用ASGI运行,调用数据库会是异步的吗?

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

一个帖子一个问题更好... 生命周期只是一个事件,就像应用程序启动时,它会知道重启,然后它只会知道。 - kyorilys
2个回答

0
  1. 看起来 lifespan 特性不应该阻塞任何没有使用该特性的 Django 应用程序。

  2. 如果您在视图中使用同步代码,则切换到 ASGI 不会自动使您的视图异步。您需要在其周围添加异步包装器。请查看 Django 文档 中关于适配器 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异步工作程序仍在同步工作


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

10
它如何回答这些问题?您是否可以详细说明一下? - helpper
3
如果您提供为什么这是首选解决方案的解释并解释其工作原理,那将更有帮助。我们想要教育,而不仅仅提供代码。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接