生产环境部署Railway时Django+Daphne出现AppRegistryNotReady错误
Django+Channels部署Railway触发AppRegistryNotReady异常解决
本地运行正常的Django项目,用Channels(Daphne)实现的WebSocket功能也能正常工作,但部署到Railway后抛出django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet错误。已确认依赖包与requirements.txt一致,且创建了runtime.txt,仍无法定位问题。完整报错日志如下:
2023-10-04 19:10:30,487 INFO /app/.env not found - if you're not configuring your environment separately, check this. Traceback (most recent call last): File "/opt/venv/bin/daphne", line 8, in <module> sys.exit(CommandLineInterface.entrypoint()) File "/opt/venv/lib/python3.10/site-packages/daphne/cli.py", line 171, in entrypoint cls().run(sys.argv[1:]) File "/opt/venv/lib/python3.10/site-packages/daphne/cli.py", line 233, in run application = import_by_path(args.application) File "/opt/venv/lib/python3.10/site-packages/daphne/utils.py", line 12, in import_by_path target = importlib.import_module(module_path) File "/root/.nix-profile/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/app/./project/asgi.py", line 1, in <module> import notification.routing File "/app/notification/routing.py", line 2, in <module> from notification.consumer import NotificationConsumer File "/app/notification/consumer.py", line 7, in <module> from notification.models import Notification File "/app/notification/models.py", line 3, in <module> from posts.models import PublishedPost File "/app/posts/models.py", line 2, in <module> from django.contrib.auth.models import User File "/opt/venv/lib/python3.10/site-packages/django/contrib/auth/models.py", line 3, in <module> from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager File "/opt/venv/lib/python3.10/site-packages/django/contrib/auth/base_user.py", line 49, in <module> class AbstractBaseUser(models.Model): File "/opt/venv/lib/python3.10/site-packages/django/db/models/base.py", line 127, in __new__ app_config = apps.get_containing_app_config(module) File "/opt/venv/lib/python3.10/site-packages/django/apps/registry.py", line 260, in get_containing_app_config self.check_apps_ready() File "/opt/venv/lib/python3.10/site-packages/django/apps/registry.py", line 138, in check_apps_ready raise AppRegistryNotReady("Apps aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
问题根源
从报错栈可以看出,asgi.py开头直接导入了notification.routing,而这个路由模块又逐级导入了Consumer、Model,此时Django的应用还没完成初始化加载,导致触发AppRegistryNotReady异常。本地环境可能因加载顺序不同未暴露这个问题,但部署到Railway时触发了提前导入的情况。
解决方案
调整asgi.py的加载顺序
必须先完成Django应用的初始化,再导入任何会引用Model的模块。修改后的asgi.py示例:import os from django.core.asgi import get_asgi_application # 先设置Django环境并初始化应用 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') django_asgi_app = get_asgi_application() # 初始化完成后再导入Channels路由 from channels.routing import ProtocolTypeRouter, URLRouter import notification.routing application = ProtocolTypeRouter({ "http": django_asgi_app, "websocket": URLRouter( notification.routing.websocket_urlpatterns ), })验证Railway启动命令
确保使用正确的Daphne启动命令,示例:daphne project.asgi:application --port $PORT --bind 0.0.0.0确认命令中的asgi模块路径正确,且Railway注入的
$PORT环境变量被正确使用。检查环境变量配置
日志提示.env文件未找到,如果已经通过Railway平台配置了Django所需的环境变量(如SECRET_KEY、DATABASE_URL等),该提示可忽略;否则需确保所有必要环境变量已配置,避免因Settings加载失败导致应用初始化异常。
内容的提问来源于stack exchange,提问作者Ahmad Hashim
相关产品推荐
相关产品推荐

