I'm tring to run my django project with usage of asgi instead of wsgi. I have set up my routing.py and asgi.py as follows:
routing.py
from django.conf.urls import url
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator,
OriginValidator
from channels.auth import AuthMiddlewareStack
from some.consumers import SomeConsumer
application = ProtocolTypeRouter({
'websocket': AllowedHostsOriginValidator(
AuthMiddlewareStack(
URLRouter(
[
url(r'^some_url/$', SomeConsumer),
]
)
)
)
})
asgi.py
import os
from channels.routing import get_default_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
application = get_default_application()
Now, as you can see it's standard setup and it works fine with default django server but when I try to run with some other (daphne or uvicorn) it's throwning this exception.
Here is my INSTALLED_APPS
INSTALLED_APPS = [
'channels',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'django_jenkins',
'easy_thumbnails',
'image_cropping',
'allauth',
'allauth.account',
'and_rest_of_my_own_apps',
]
Has anyone had problem like this?
---- EDIT ----
Here is a stacktrace:
Traceback (most recent call last):
File "/path/to/my/env/bin/daphne", line 11, in <module>
sys.exit(CommandLineInterface.entrypoint())
File "/path/to/my/env/lib/python3.6/site-packages/daphne/cli.py", line 161, in entrypoint
cls().run(sys.argv[1:])
File "/path/to/my/env/lib/python3.6/site-packages/daphne/cli.py", line 222, in run
application = import_by_path(args.application)
File "/path/to/my/env/lib/python3.6/site-packages/daphne/utils.py", line 12, in import_by_path
target = importlib.import_module(module_path)
File "/path/to/my/env/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "./my_project/asgi.py", line 5, in <module>
application = get_default_application()
File "/path/to/my/env/lib/python3.6/site-packages/channels/routing.py", line 33, in get_default_application
module = importlib.import_module(path)
File "/path/to/my/env/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "./my_project/routing.py", line 4, in <module>
from channels.auth import AuthMiddlewareStack
File "/path/to/my/env/lib/python3.6/site-packages/channels/auth.py", line 12, in <module>
from django.contrib.auth.models import AnonymousUser
File "/path/to/my/env/lib/python3.6/site-packages/django/contrib/auth/models.py", line 2, in <module>
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
File "/path/to/my/env/lib/python3.6/site-packages/django/contrib/auth/base_user.py", line 47, in <module>
class AbstractBaseUser(models.Model):
File "/path/to/my/env/lib/python3.6/site-packages/django/db/models/base.py", line 100, in __new__
app_config = apps.get_containing_app_config(module)
File "/path/to/my/env/lib/python3.6/site-packages/django/apps/registry.py", line 244, in get_containing_app_config
self.check_apps_ready()
File "/path/to/my/env/lib/python3.6/site-packages/django/apps/registry.py", line 127, in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
and command
daphne -b 0.0.0.0 -p 8000 my_project.asgi:application --access-log=./logs/daphne-access.log
As well as WSGI, Django also supports deploying on ASGI, the emerging Python standard for asynchronous web servers and applications.
ASGI (Asynchronous Server Gateway Interface) provides an interface between async Python web servers and applications while it supports all the features provided by WSGI.
For anyone using Django > 3.0 refer to link below. It worked for me
https://github.com/django/channels/issues/1564#issuecomment-722354397
all you have to do is to call get_asgi_application()
before importing anything else
Sample of my asgi.py
file:
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
django_asgi_app = get_asgi_application()
from django.conf import settings
from .routing import asgi_routes
asgi_routes["http"] = django_asgi_app
application = ProtocolTypeRouter(asgi_routes)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With