Невозможно импортировать модуль ASGI_APPLICATION, пока сервер выполнения использует каналы 2
Я следовал за учебником каналов, но во время выполнения этих ошибок
Версия пакетов -каналы == 2.1.2Django == 2.0.4
что я пропустил? в settings.py
INSTALLED_APPS = [
"channels"
....
]
ROOT_URLCONF = 'myapp.urls'
ASGI_APPLICATION = "myapp.routing.application"
добавлен файл mayapp/routing.py
from channels.routing import ProtocolTypeRouter
application = ProtocolTypeRouter({
# Empty for now (http->django views is added by default)
})
это журнал ошибок
System check identified no issues (0 silenced).
August 01, 2018 - 13:11:42
Django version 2.0.4, using settings 'myapp.local_settings'
Starting ASGI/Channels version 2.1.2 development server at http://127.0.0.1:8080/
Quit the server with CONTROL-C.
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x7f71ecfb6400>
Traceback (most recent call last):
File "/home/vkchlt0192/myapp/lib/python3.5/site-packages/channels/routing.py", line 33, in get_default_application
module = importlib.import_module(path)
File "/home/vkchlt0192/myapp/lib/python3.5/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 956, in _find_and_load_unlocked
ImportError: No module named 'myapp.routing'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/vkchlt0192/myapp/lib/python3.5/site-packages/django/utils/autoreload.py", line 225, in wrapper
fn(*args, **kwargs)
File "/home/vkchlt0192/myapp/lib/python3.5/site-packages/channels/management/commands/runserver.py", line 80, in inner_run
application=self.get_application(options),
File "/home/vkchlt0192/myapp/lib/python3.5/site-packages/channels/management/commands/runserver.py", line 105, in get_application
return StaticFilesWrapper(get_default_application())
File "/home/vkchlt0192/myapp/lib/python3.5/site-packages/channels/routing.py", line 35, in get_default_application
raise ImproperlyConfigured("Cannot import ASGI_APPLICATION module %r" % path)
django.core.exceptions.ImproperlyConfigured: Cannot import ASGI_APPLICATION module 'myapp.routing'
20 ответов
В моем случае это был неправильный импорт в другой файл.
Что тебе следует сделать
python manage.py shell
from mysite.routing import application
Посмотрите, какую именно ошибку он выдает, и попробуйте исправить это
Просто поменяй
ASGI_APPLICATION = mysite.routing.application
в
ASGI_APPLICATION = "routing.application"
Проверьте наличие возможных ошибок (возможно, ошибки импорта) в consumer.py. Также попробуйте добавить каналы в качестве первого элемента в INSTALLED_APPS в settings.py.
Как указано в документе каналов:
Сервер разработки каналов будет конфликтовать с любыми другими сторонними приложениями, для которых требуется команда перегруженного сервера или сервера замены. Пример такого конфликта - с whitenoise.runserver_nostatic от whitenoise. Чтобы решить такие проблемы, попробуйте переместить каналы в верхнюю часть вашего INSTALLED_APPS или вообще удалить приложение-нарушитель.
Это мне помогло: Все с
ASGI_APPLICATION
было хорошо (спасибо за все предыдущие ответы, данные здесь). Но я прочитал логи немного дальше, и оказалось, что где-то еще была ошибка импорта:
ImportError: cannot import name 'channel_session_user_from_http' from 'channels.auth'
Как только я избавился от него, все вернулось на круги своя.
Вы должны поставить свой routing.py
файл внутри mayapp/mayapp/routing.py
вместо mayapp/routing.py
Django 2.2 не имеет встроенной поддержки ASGI, поэтому нам нужно использовать резервную альтернативу Channel. Создайте myproject/asgi.py следующим образом:
import os
import django
from channels.http import AsgiHandler
from channels.routing import ProtocolTypeRouter
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
django.setup()
application = ProtocolTypeRouter({
"http": AsgiHandler(),
# Just HTTP for now. (We can add other protocols later.)
})
источник: Каналы Документы.
На случай, если кто-нибудь придет к этому. Помните: ASGI_APPLICATION = "myapp.routing.application" должен находиться в самом низу settings.py, чтобы гарантировать, что ничто не застрянет в процессе производства!
mysite / myapp / routing.py
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import myapp.routing
application = ProtocolTypeRouter({
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
myapp.routing.websocket_urlpatterns
)
),
})
myapp / routing.py
from django.urls import path
from . import consumers
websocket_urlpatterns = [
path('chatroompage', consumers.ChatConsumer),
]
При импорте вашего приложения с абсолютным путем в myapp/routing убедитесь, что оно импортировано как:
импортировать myapp.routing
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import myapp.routing
application = ProtocolTypeRouter({
# (http->django views is added by default)
'websocket': AuthMiddlewareStack(
URLRouter(
myapp.routing.websocket_urlpatterns
)
),
})
Это может выдать предупреждение как ошибку в PyCharm, но у вас будут рабочие каналы Django. Я сообщил об этом как об ошибке в PyCharm. Надеюсь, никто не потратит на это 3-4 часа, как я)
В моем случае были нерешенные пакеты в consumer.py, проверьте, есть ли у вас неразрешенные пакеты в ваших каналах.py файлов
Я тоже столкнулся с той же проблемой.
Убедитесь, что:
=> Файл routing.py должен находиться внутри корневой папки проекта (т.е. сервер django, на котором есть settings.py, wsgi.py,..)
=> В settings.py include, ASGI_APPLICATION = "yourprojectrootname.routing.заявление"
=> Иногда кодировка внутри файла routing.py может генерировать эту ошибку, чтобы проверить, так ли это, удалите всю кодировку и введите общую кодировку шаблона,
from channels.routing import ProtocolTypeRouter
application = ProtocolTypeRouter({
# Empty for now (http->django views is added by default)
})
затем запустите сервер запуска python manage.py. На этот раз, если вы не получили никаких ошибок, проблема заключается в кодировании внутри routing.py. Отладьте и устраните проблему.
=> В других случаях это может быть проблема с версией, переход на каналы ==2.1.2 работает
Я написал приведенный ниже код в файле asgi.py, websocket_urlpatterns импортирован из файла routing.py. Это сработало для меня.
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter,URLRouter
from channels.auth import AuthMiddlewareStack
from .routing import websocket_urlpatterns
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myApp.settings')
application = ProtocolTypeRouter({
'http': get_asgi_application(),
'websocket': AuthMiddlewareStack(URLRouter(websocket_urlpatterns))
})
пытаться
python3 manage.py shell
>>> from your_project import asgi
если вы видите ниже
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/your_project/asgi.py", line 14, in <module>
from django.core.asgi import get_asgi_application
ModuleNotFoundError: No module named 'django.core.asgi'
ваша версия django ниже 3.x. asgi поддерживается после 3.x
нашел это отсюда
У меня также была такая же проблема, я сделал все, чтобы ее решить, создал другую виртуальную среду и установил более старую версию Django, но после 2 дней использования оборудования я понял, что мой файл consumer.py отсутствует только с буквой s в пользовательском 'и после этого я также исправил в своем файле routing.py. Возможно, это может быть вашей проблемой, также сначала проверьте все имена файлов.
Изменять:
ASGI_APPLICATION = 'myproject.routing.application'
К
ASGI_APPLICATION = "myproject.asgi.application"
и проблема, надеюсь, будет решена, подробности смотрите на сайте официальных каналов (https://channels.readthedocs.io/en/stable/installation.html)
Эта проблема, конечно, связана с тем, что вы не импортировали get_asgi_application в файл asgi.py в settings.py. На самом деле у меня была такая же проблема, когда я пытался развернуть свое приложение, но смог решить ее, импортировав get_asgi_application и используя его в качестве традиционного резервного HTTP-запроса, например так в файле asgi.py:
mport os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application
from django.urls import path
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
# Initialize Django ASGI application early to ensure the AppRegistry
# is populated before importing code that may import ORM models.
django_asgi_app = get_asgi_application()
from chat.consumers import AdminChatConsumer, PublicChatConsumer
application = ProtocolTypeRouter({
# Django's ASGI application to handle traditional HTTP requests
"http": django_asgi_app,
# WebSocket chat handler
"websocket": AllowedHostsOriginValidator(
AuthMiddlewareStack(
URLRouter([
path("chat/admin/", AdminChatConsumer.as_asgi()),
path("chat/", PublicChatConsumer.as_asgi()),
])
)
),
})
Я недавно столкнулся с этой проблемой и быстро решил. После проверки конфигураций вsettings.py
а также routing.py
, Я обнаружил, что проблема в этой строке:
from channels.auth import AuthMiddlewareStack
проблема в совместимости версий. Затем я обновилrequirements.txt
ниже, и он работает тихо.
channels==2.4.0
channels-redis==2.4.2
daphne==2.5.0
Вы должны положить routing.py
внутри mysite/mysite/
не mysite/
иначе вы не сможете использовать ASGI_APPLICATION = mysite.routing.application
в файле настроек, и вы получите эту ошибку.
Я решил свою проблему:
- python manage.py мигрировать
- python manage.py makemigrations
- python manage.py мигрировать
Также проверьте, не поместили ли вы файл routing.py не в тот каталог. Это должен быть myproject/routing.py.
Изменение определения переменной ASGI_APPLICATION и переменной CHANNEL_LAYERS.default.ROUTING из
<project_name>.routing.application
к
routing.application
С этим я могу нормально бегать
Проблема с версией Джанго
Ни один из вышеперечисленных и других ответов на переполнение стека не вызвал у меня проблемы. Я попробовал полный код из документации, используя Django версии 3, но без помощи, и ошибка по-прежнему появляется каждый раз.
Решение
решен путем понижения версии Django с версии 3 до 2.2 и следования инструкциям версии 2.2 (раздел примечаний) в документации
https://channels.readthedocs.io/en/stable/tutorial/part_1.html