django 频道配置不当:在 ASGI_APPLICATION 模块中找不到“应用程序”
Posted
技术标签:
【中文标题】django 频道配置不当:在 ASGI_APPLICATION 模块中找不到“应用程序”【英文标题】:django channels ImproperlyConfigured: Cannot find 'app' in ASGI_APPLICATION module 【发布时间】:2019-04-08 10:33:10 【问题描述】:我正在使用 Django 设置频道 asgi。我已经尝试升级 Django 和 Channels。
"Cannot find %r in ASGI_APPLICATION module %s" % (name, path)
django.core.exceptions.ImproperlyConfigured: Cannot find 'app' in ASGI_APPLICATION module <MyApp>.routing
我的路由配置是按照 mysite/routing 中的教程进行的
application = ProtocolTypeRouter(
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
chat.routing.websocket_urlpatterns
)
),
)
以及应该只是简单的导入语句
import chat.routing
我的目录结构也完全按照教程进行
通过设置配置
INSTALLED_APPS = [
'channels',
'chat',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
和
ASGI_APPLICATION = 'chat.routing.application'
谢谢
【问题讨论】:
添加您的路由配置。添加相关代码sn-ps。 【参考方案1】:我在使用daphne 服务器运行我的Django Channels 的routing.py
时遇到这种错误。
django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
这是关于daphne 服务器的文档解释,
Daphne 是用于 ASGI 和 ASGI-HTTP 的 HTTP、HTTP2 和 WebSocket 协议服务器,旨在为 Django 通道提供支持。
支持协议自动协商;无需使用 URL 前缀来确定 WebSocket 端点还是 HTTP 端点。
注意:Daphne 2 与 Channels 1.x 应用程序不兼容,仅与 Channels 2.x 和其他 ASGI 应用程序兼容。安装 1.x 版本的 Daphne 以获得 Channels 1.x 支持。
如您所见,我们可以通过daphne 服务器同时使用HTTP
和WS
protocol,而无需使用Gunicorn 服务器。您可以做的就是在您的 routing.py
文件顶部添加以下行。
from .wsgi import *
所以现在你的routing.py
文件应该是这样的,
# DockerDjangonginx is my project name
# your routing.py file should be in this location where the wsgi.py file is placed
# DockerDjangoNginx/DockerDjangoNginx/routing.py
from .wsgi import * # add this line to top of your code
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import comapp.routing as routing
application = ProtocolTypeRouter(
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
routing.websocket_urlpatterns
)
),
)
现在你可以运行你的daphne 服务器了。
(venv) [root@t2mdocker]#daphne -b 0.0.0.0 -p 8000 DockerDjangoNginx.routing:application
2019-05-30 03:33:06,390 INFO Starting server at tcp:port=8000:interface=0.0.0.0
2019-05-30 03:33:06,391 INFO HTTP/2 support enabled
2019-05-30 03:33:06,391 INFO Configuring endpoint tcp:port=8000:interface=0.0.0.0
2019-05-30 03:33:06,392 INFO Listening on TCP address 0.0.0.0:8000
如果您在运行daphne 服务器时看到类似HTTP/2 support not enabled (install the http2 and tls Twisted extras)
的内容,您可以运行pip install -U Twisted[tls,http2]
来纠正这些错误。
【讨论】:
谢谢谢谢谢谢你花了几天时间,终于只有你的向导完成了 @Hamedio 很高兴听到这个消息,很乐意为您提供帮助。【参考方案2】:很确定这是问题所在。需要在wsgi.py旁边添加这个asgi.py文件
import os
import django
from channels.routing import get_default_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<myproj>.settings")
django.setup()
application = get_default_application()
并启动服务器
(vEnv)$daphne <myproj>.asgi:application --port 8888
【讨论】:
【参考方案3】:尝试以下方法,它对我有用:
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from chat import routing # This change
application = ProtocolTypeRouter(
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
routing.websocket_urlpatterns #This change
)
),
)
【讨论】:
【参考方案4】:检查你的 settings.py,你说它包括:
ASGI_APPLICATION = 'chat.routing.application'
但是chat是你添加的应用程序,它应该是django项目本身的名称,所以在你说你遵循的教程中它应该是这样的:
ASGI_APPLICATION = 'mysite.routing.application'
# or
ASGI_APPLICATION = 'core.routing.application'
【讨论】:
【参考方案5】:变化:
ASGI_APPLICATION = 'myproject.routing.application'
到
ASGI_APPLICATION = "myproject.asgi.application"
问题有望得到解决,查看官方频道网站了解更多详情 (https://channels.readthedocs.io/en/stable/installation.html)
【讨论】:
以上是关于django 频道配置不当:在 ASGI_APPLICATION 模块中找不到“应用程序”的主要内容,如果未能解决你的问题,请参考以下文章