Djangochannelsrestframework 不像文档中那样工作

问题描述 投票:0回答:2

我正在尝试使用 djangochannelsrestframework 创建 websocket 连接。我像在文档中一样尝试了所有,但出现了这个错误 “django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。”

https://djangochannelsrestframework.readthedocs.io/

我的回溯是

    Traceback (most recent call last):
  File "/home/user/Projects/igroteka/venv/bin/daphne", line 8, in <module>
    sys.exit(CommandLineInterface.entrypoint())
  File "/home/user/Projects/igroteka/venv/lib/python3.8/site-packages/daphne/cli.py", line 170, in entrypoint
    cls().run(sys.argv[1:])
  File "/home/user/Projects/igroteka/venv/lib/python3.8/site-packages/daphne/cli.py", line 232, in run
    application = import_by_path(args.application)
  File "/home/user/Projects/igroteka/venv/lib/python3.8/site-packages/daphne/utils.py", line 12, in import_by_path
    target = importlib.import_module(module_path)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 848, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/user/Projects/igroteka/./igroteka/asgi.py", line 12, in <module>
    import socketapp.routing
  File "/home/user/Projects/igroteka/./socketapp/routing.py", line 2, in <module>
    from socketapp import consumers
  File "/home/user/Projects/igroteka/./socketapp/consumers.py", line 1, in <module>
    from games.models import Games
  File "/home/user/Projects/igroteka/./games/models.py", line 11, in <module>
    class GamesCategories(models.Model):
  File "/home/user/Projects/igroteka/venv/lib/python3.8/site-packages/django/db/models/base.py", line 127, in __new__
    app_config = apps.get_containing_app_config(module)
  File "/home/user/Projects/igroteka/venv/lib/python3.8/site-packages/django/apps/registry.py", line 260, in get_containing_app_config
    self.check_apps_ready()
  File "/home/user/Projects/igroteka/venv/lib/python3.8/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.
Sentry is attempting to send 2 pending error messages
Waiting up to 2 seconds
Press Ctrl-C to quit

这是我用于检查代码的 github 存储库 https://github.com/muradoff101/igroteka/tree/master

django django-rest-framework websocket django-channels
2个回答
0
投票

如果您的消费者导入您的模型,那么您需要在导入路由之前在

get_asgi_application()
中调用
asgi.py
,否则Django会在Django初始化之前创建模型时抛出错误

asgi.py:

import os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'igroteka.settings')
django_asgi_app = get_asgi_application() # Call this before importing routing

import socketapp.routing

application = ProtocolTypeRouter({
    "http": django_asgi_app,
    "websocket": AuthMiddlewareStack(
        URLRouter(
            socketapp.routing.websocket_urlpatterns
        )
    ),
})

0
投票

也许您安装了最新的默认通道版本 4,这不会在开发模式下启动 ASGI 服务器。请验证这一点并安装频道版本 == 3.0.5 。当您运行 runserver 命令时,请验证 ASGI 服务器是否启动。

(第 4 版通过 daphne 支持 ASGI 服务器,我想是的,没试过。)

© www.soinside.com 2019 - 2024. All rights reserved.