使用 asgi 时尚未加载 Django 应用程序
Django apps aren't loaded yet when using asgi
我正在尝试 运行 我的 django 项目使用 asgi 而不是 wsgi。我已将 routing.py 和 asgi.py 设置如下:
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()
现在,如您所见,它是标准设置,它在默认的 django 服务器上运行良好,但是当我尝试 运行 与其他服务器(daphne 或 uvicorn)一起使用时,它会抛出此异常。
这是我的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',
]
有人遇到过这样的问题吗?
---- 编辑 ----
这是堆栈跟踪:
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.
和命令
daphne -b 0.0.0.0 -p 8000 my_project.asgi:application --access-log=./logs/daphne-access.log
在独立应用程序中使用 Django 基础结构之前,您应该始终做 django.setup()
所以,你的 asgi.py
应该是这样的
import os
from channels.routing import get_default_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
django.setup()
application = get_default_application()
对于使用 Django > 3.0 的任何人,请参阅下面的 link。它对我有用
https://github.com/django/channels/issues/1564#issuecomment-722354397
您所要做的就是在导入任何其他内容之前调用 get_asgi_application()
我的 asgi.py
文件示例:
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)
原来django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet
错误在Channels lib, happened due to invalid import order in my application - as explained here.
原因:
我在导入 django_asgi_app
实例之前导入了 WSAccessTokenAuthMiddleware
。
解法:
在 WSAccessTokenAuthMiddleware
之前导入我的 django_asgi_app
解决了问题。
# First, import app created by get_asgi_application() - django.core.asgi
from general.settings.asgi import application as django_asgi_app
# Second, import my middleware and consumers
from general.consumers import ModelConsumer
from general.util.auth import WSAccessTokenAuthMiddleware
# Third, Import channels classes
from django.conf.urls import url
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter
from channels.routing import URLRouter
application = ProtocolTypeRouter({
"http": django_asgi_app,
'websocket': WSAccessTokenAuthMiddleware(
AuthMiddlewareStack(
URLRouter([
url('ws/models/(?P<model_name>\w+)', ModelConsumer.as_asgi()),
])
)
)
})
我正在尝试 运行 我的 django 项目使用 asgi 而不是 wsgi。我已将 routing.py 和 asgi.py 设置如下:
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()
现在,如您所见,它是标准设置,它在默认的 django 服务器上运行良好,但是当我尝试 运行 与其他服务器(daphne 或 uvicorn)一起使用时,它会抛出此异常。
这是我的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',
]
有人遇到过这样的问题吗?
---- 编辑 ----
这是堆栈跟踪:
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.
和命令
daphne -b 0.0.0.0 -p 8000 my_project.asgi:application --access-log=./logs/daphne-access.log
在独立应用程序中使用 Django 基础结构之前,您应该始终做 django.setup()
所以,你的 asgi.py
应该是这样的
import os
from channels.routing import get_default_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
django.setup()
application = get_default_application()
对于使用 Django > 3.0 的任何人,请参阅下面的 link。它对我有用
https://github.com/django/channels/issues/1564#issuecomment-722354397
您所要做的就是在导入任何其他内容之前调用 get_asgi_application()
我的 asgi.py
文件示例:
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)
原来django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet
错误在Channels lib, happened due to invalid import order in my application - as explained here.
原因:
我在导入 django_asgi_app
实例之前导入了 WSAccessTokenAuthMiddleware
。
解法:
在 WSAccessTokenAuthMiddleware
之前导入我的 django_asgi_app
解决了问题。
# First, import app created by get_asgi_application() - django.core.asgi
from general.settings.asgi import application as django_asgi_app
# Second, import my middleware and consumers
from general.consumers import ModelConsumer
from general.util.auth import WSAccessTokenAuthMiddleware
# Third, Import channels classes
from django.conf.urls import url
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter
from channels.routing import URLRouter
application = ProtocolTypeRouter({
"http": django_asgi_app,
'websocket': WSAccessTokenAuthMiddleware(
AuthMiddlewareStack(
URLRouter([
url('ws/models/(?P<model_name>\w+)', ModelConsumer.as_asgi()),
])
)
)
})