Ошибка при интеграции каналов django с существующим кодом wsgi django 3.1

При добавлении каналов в Django я получаю следующую ошибку.

Исключение внутри приложения: init () принимает 1 позиционный аргумент при добавлении ASGI_APPLICATION в Django 3.1 для каналов

Exception inside application: __init__() takes 1 positional argument but 2 were given
Traceback (most recent call last):
  File "/home/dell/Desktop/s/s/s-env/lib/python3.6/site-packages/channels/staticfiles.py", line 44, in __call__
    return await self.application(scope, receive, send)
  File "/home/dell/Desktop/s/s/s-env/lib/python3.6/site-packages/channels/routing.py", line 71, in __call__
    return await application(scope, receive, send)
  File "/home/dell/Desktop/s/s/s-env/lib/python3.6/site-packages/channels/routing.py", line 160, in __call__
    send,
  File "/home/dell/Desktop/s/s/s-env/lib/python3.6/site-packages/asgiref/compatibility.py", line 33, in new_application
    instance = application(scope)
TypeError: __init__() takes 1 positional argument but 2 were give

Приложение отлично работает с конфигурацией WSGI. Вышеупомянутая ошибка появляется только при добавлении ASGI_APPLICATION = 'app.routing.application'.

Поскольку он показывает ошибку, происходящую из статических файлов, я снова попытался сгенерировать статические файлы, но это не помогло.

Я использую файл asgi django по умолчанию:

"""
ASGI config for mevsyou project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 's.settings.local')

application = get_asgi_application()

s / routing.py:

from channels.routing import ProtocolTypeRouter, URLRouter
from users import routing

application = ProtocolTypeRouter({
    'http': URLRouter(routing.urlpatterns),
})

person Mobeen    schedule 18.11.2020    source источник
comment
Вам необходимо определить конструктор __init__ для application с двумя параметрами: __init__(self, scope).   -  person Willem Van Onsem    schedule 19.11.2020
comment
@WillemVanOnsem, где? У меня есть файл django asgi.py по умолчанию   -  person Mobeen    schedule 19.11.2020
comment
не файл asgi, а файл app.routing.application.   -  person Willem Van Onsem    schedule 19.11.2020
comment
Если вы хотите поддерживать и то, и другое, вы можете использовать __init__(self, *args) или __init__(self, *args, **kwargs), если хотите быть как можно более универсальным.   -  person Nadeem Douba    schedule 19.11.2020
comment
@WillemVanOnsem Я добавил код routing.py   -  person Mobeen    schedule 19.11.2020
comment
@NadeemDouba Где?   -  person Mobeen    schedule 19.11.2020
comment
Какая версия django-каналов?   -  person Antoine Pinsard    schedule 19.11.2020


Ответы (1)


Ваш код предназначен для каналов 2, а вы используете каналы 3.

В каналах 3 у вас не должно быть routing.py. Но ваш asgi.py файл должен выглядеть так:

import os

from channels.routing import ProtocolTypeRouter
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
})

Фактически, ASGI_APPLICATION должно быть установлено в 'app.asgi.application'.

См. документацию по каналам для 3.x

person Antoine Pinsard    schedule 19.11.2020
comment
У меня версия 3. - person Mobeen; 26.11.2020
comment
Так вот в чем проблема. Ваш код предназначен для каналов 2. Если вы используете версию 3, обязательно следуйте документации для каналов 3. - person Antoine Pinsard; 27.11.2020