Невозможно импортировать модуль 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: нет модуля с именем «django.core.asgi»

У меня также была такая же проблема, я сделал все, чтобы ее решить, создал другую виртуальную среду и установил более старую версию 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

Другие вопросы по тегам