【问题标题】:Django daphne asgi: Django can only handle ASGI/HTTP connections, not websocketDjango daphne asgi:Django 只能处理 ASGI/HTTP 连接,不能处理 websocket
【发布时间】:2020-05-11 11:30:00
【问题描述】:

这真的很令人沮丧,我确实根据文档设置了所有内容,但是当我尝试独立运行它时,daphne 不断抛出错误,当我使用python manage.py run server 时它确实可以正常工作。这非常令人沮丧,我似乎在其他任何地方都找不到类似的错误

2020-01-25 09:57:17,627 INFO     Starting server at tcp:port=8000:interface=127.0.0.1
2020-01-25 09:57:17,628 INFO     HTTP/2 support not enabled (install the http2 and tls Twisted extras)
2020-01-25 09:57:17,628 INFO     Configuring endpoint tcp:port=8000:interface=127.0.0.1
2020-01-25 09:57:17,629 INFO     Listening on TCP address 127.0.0.1:8000
127.0.0.1:44516 - - [25/Jan/2020:09:57:27] "WSCONNECTING /ws/score/" - -
2020-01-25 09:57:28,637 ERROR    Exception inside application: Django can only handle ASGI/HTTP connections, not websocket.
  File "/home/sofdeath/.local/lib/python3.7/site-packages/daphne/cli.py", line 30, in asgi
    await self.app(scope, receive, send)
  File "/home/sofdeath/.local/lib/python3.7/site-packages/django/core/handlers/asgi.py", line 146, in __call__
    % scope['type']
  Django can only handle ASGI/HTTP connections, not websocket.
127.0.0.1:44516 - - [25/Jan/2020:09:57:28] "WSDISCONNECT /ws/score/" - -
^C2020-01-25 09:57:39,126 INFO     Killed 0 pending application instances

这是我的 asgi.py

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tabulator.settings')

application = get_asgi_application()

我的路由.py:

from django.urls import re_path
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator, OriginValidator
import judge.routing

application = ProtocolTypeRouter({
    # (http->django views is added by default)
    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                judge.routing.websocket_urlpatterns
            )
        )
    ),
})

在我的 settings.py 中:

INSTALLED_APPS = [
    ...
    'channels',
]
...
WSGI_APPLICATION = 'tabulator.wsgi.application'
ASGI_APPLICATION = "tabulator.routing.application"
...
CHANNEL_LAYERS = {
    "default": {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)],
        },
    },
}

【问题讨论】:

    标签: django daphne asgi


    【解决方案1】:

    将您的 asgi.py 更改为:

    import os
    import django
    from channels.routing import get_default_application
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tabulator.settings')
    
    django.setup()
    
    application = get_default_application()
    

    【讨论】:

    • 哦,这确实有效。我最初认为它没有,因为我没有看到它也在教程中将from django.core.asgi import get_asgi_application 更改为from channels.routing import get_default_application。其他读者注意:本文取自the Channels deployment guide
    • @ahmadgh74 哇!
    【解决方案2】:

    按照@ahmad 的说法更改您的asgi.py 并将您的settings.py 编辑为:

    CHANNEL_LAYERS = {
        "default": {
            'BACKEND': 'channels_redis.core.RedisChannelLayer',
            'CONFIG': {
                "hosts": [("redis", 6379)],
            },
        },
    }
    

    并确保DEBUG = False。那是因为你没有在本地服务器上运行你的项目,如果你使用"127.0.0.1""localhost",它会抛出一个错误。

    【讨论】:

      猜你喜欢
      • 2021-01-21
      • 2021-09-14
      • 2023-01-24
      • 2014-03-16
      • 2018-07-02
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多