3

I am trying out django channels 2.x. After installing and configuring channels. When I execute the runserver command. I get the following error

Traceback (most recent call last): File "C:\Subbu\Episkope\Lessons\Django\WsChat\env\lib\site-packages\daphne\http_protocol.py", line 179, in process "server": self.server_addr, TypeError: call() got an unexpected keyword argument 'receive'

My settings file:

"""
Django settings for WsChatProj project.

Generated by 'django-admin startproject' using Django 2.2.

For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'kl$#^tt6qnt8ww^rrhmj&&(l0&as4w-#fkb&a0e#^@&vz3*t)a'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',    
    'channels',
    'WsChatApp',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'WsChatProj.urls'

STATIC_URL = '/static/'

# Extra places for collectstatic to find static files.
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'WsChatProj.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = '/static/'

ASGI_APPLICATION = 'WsChatApp.routing.application'

My asgi.py

import os
import django
from channels.routing import get_default_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "WsChatApp.settings")
django.setup()
application = get_default_application()

My routing.py

from django.conf.urls import url
from django.urls import path
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator, OriginValidator
# from WsChatApp.consumers import ChatConsumer

application = ProtocolTypeRouter
({

})

I have commented out the consumers.py completely just to first solve this error so there are no consumers at the moment

Library Versions

Channels 2.2.0
asgiref 2.2.0
redis 2.10.6
asgi-redis 1.4.3

The other question I have is, is it not absolutely necessary to have a channel layer? because in the tutorial I am following they are setting no channel info in the settings.py. Does the latest channels library manage this under the hood?

Subbu
  • 588
  • 1
  • 7
  • 18
  • Yes, you need a channel layer. Channels uses the pub-sub architecture to communicate between instances of the ASGI applications and the channel layer is at the core of it. The docs says it's optional but your chat app won't work well without it – Ken4scholars Apr 19 '19 at 00:40
  • I shall try again with the channel layer and let you know if the issue gets resolved, I doubt if this error is due to absence of the channel layer. – Subbu Apr 19 '19 at 05:11
  • Hi Ken! the issue is still not resolved, so this looks to be something different may be a version conflict or something. – Subbu Apr 19 '19 at 07:50
  • My answer was for your last question and not for the error. What command exactly do you run? Also post the full stacktrace – Ken4scholars Apr 19 '19 at 10:03
  • Hi Ken thanks for your efforts! I just resolved the issue. The issue was something to do with the routing.py for the channels. It just vanished magically after rewriting the code again, don't know how. Will post a detailed answer with what I did soon. – Subbu Apr 19 '19 at 11:09
  • I am facing same issue. can you please help me..! – ameya Oct 27 '20 at 19:09
  • facing same issue – Karam Haj Nov 04 '20 at 14:01
  • facing it too ... – Bsquare ℬℬ Nov 26 '20 at 16:03
  • Usually the best way to fix this is to *check errors* using `sudo systemctl status daphne`. On my side, I was getting `ERROR: Exception inside application: Django can only handle ASGI/HTTP connections`, so I needed to change `asgi.py` using this [post](https://stackoverflow.com/a/59909118/7856775) – Brian Jan 03 '21 at 16:40

1 Answers1

0

You need to make changes in your asgi.py
Make this as your asgi.py

"""
ASGI config for proj 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
import django
from channels.http import AsgiHandler
from channels.routing import ProtocolTypeRouter, URLRouter

from channels.auth import AuthMiddlewareStack
from django.urls import path
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

application = get_asgi_application()

ws_pattern = []

application = ProtocolTypeRouter({
    "websocket" : AuthMiddlewareStack(URLRouter(
        ws_pattern
    ))
})