【问题标题】:Getting a "Django can only handle ASGI/HTTP connections, not websocket." error when hosting ASGI on heroku?获取“Django 只能处理 ASGI/HTTP 连接,不能处理 websocket。”在heroku上托管ASGI时出错?
【发布时间】:2021-09-14 17:42:51
【问题描述】:

浏览 StackOverflow 和 Youtube 上的每个问题以找到答案。我正在通过 Heroku 上的 Django 通道部署 WSGI 和 ASGI/websockets。它在本地工作,但在生产过程中给我带来了麻烦。

设置

这是我的过程文件:

web: daphne API.asgi:application --port $PORT --bind 0.0.0.0 -v2
worker: python manage.py runworker background -v2

Settings.py:

# Redis Setup
ASGI_APPLICATION = 'API.routing.application'
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [(HEROKU_URL, 6379)],
        },
    },
}

asgi.py:

import os
import django
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'API.settings')
django.setup()
application = get_asgi_application()

最后,routing.py:

application = ProtocolTypeRouter({
    'websocket':AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                [
                    url(r"^timer/$", TestConsumer.as_asgi()),
                ]
            )
        )
    )
    ,'channel':ChannelNameRouter({
        'background':BackgroundConsumer.as_asgi()
    })
}) 

问题/日志

连接到 websocket 时的 Heroku 日志:

2021-07-02T19:42:42.209398+00:00 app[web.1]: IP - - [02/Jul/2021:19:42:42] "GET /chat_switch/1/" 200 10480
2021-07-02T19:43:02.708851+00:00 app[web.1]: IP - - [02/Jul/2021:19:43:02] "WSCONNECTING /timer/" - -
2021-07-02T19:43:02.709658+00:00 app[web.1]: 2021-07-02 19:43:02,709 DEBUG    Upgraded connection [IP, 32183] to WebSocket
2021-07-02T19:43:03.058159+00:00 app[web.1]: 2021-07-02 19:43:03,057 ERROR    Exception inside application: Django can only handle ASGI/HTTP connections, not websocket.
2021-07-02T19:43:03.058167+00:00 app[web.1]: Traceback (most recent call last):
2021-07-02T19:43:03.058168+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.8/site-packages/django/core/handlers/asgi.py", line 143, in __call__
2021-07-02T19:43:03.058168+00:00 app[web.1]:     raise ValueError(
2021-07-02T19:43:03.058169+00:00 app[web.1]: ValueError: Django can only handle ASGI/HTTP connections, not websocket.
2021-07-02T19:43:03.059813+00:00 app[web.1]: 2021-07-02 19:43:03,059 INFO     failing WebSocket opening handshake ('Internal server error')
2021-07-02T19:43:03.060494+00:00 app[web.1]: 2021-07-02 19:43:03,060 WARNING  dropping connection to peer tcp4:IP:32183 with abort=False: Internal server error
2021-07-02T19:43:03.064484+00:00 app[web.1]: 2021-07-02 19:43:03,063 DEBUG    WebSocket closed for [IP, 32183]

除此之外,常规 API 函数按预期工作。

我尝试过的

如果有人知道我可以从这里做什么,我将不胜感激。

【问题讨论】:

    标签: python django heroku websocket


    【解决方案1】:

    看起来routing.py 中的application 没有做任何事情。我看到它在ASGI_APPLICATION 中指定,但我相信它被开发服务器(manage.py runserver)使用。在您的 daphne 命令中,您正在为 API.asgi:application 提供服务,它只定义了 django ASGI 应用程序 - “http”连接处理程序。

    您需要将get_asgi_application() 替换为ProtocolTypeRouter,该ProtocolTypeRouter 定义了每个协议的服务方式——“http”进入 django ASGI 应用程序,“websocket”进入您的消费者路由。

    查看频道文档中的Deploying 部分。你的asgi.py 可能看起来像这样(我没有包括你的消费者进口):

    import os
    
    from django.core.asgi import get_asgi_application
    from django.urls import path
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'API.settings')
    
    django_asgi_app = get_asgi_application()
    
    from channels.auth import AuthMiddlewareStack
    from channels.security.websocket import AllowedHostsOriginValidator
    from channels.routing import ProtocolTypeRouter, URLRouter, ChannelNameRouter
    
    application = ProtocolTypeRouter({
        'http': django_asgi_app,
        'websocket': AllowedHostsOriginValidator(
            AuthMiddlewareStack(
                URLRouter(
                    [
                        path('timer/', TestConsumer.as_asgi()),
                    ]
                )
            )
        ),
        'channel': ChannelNameRouter({
            'background': BackgroundConsumer.as_asgi()
        })
    })
    

    【讨论】:

      猜你喜欢
      • 2021-01-21
      • 2020-05-11
      • 2023-01-24
      • 2020-08-07
      • 2022-09-30
      • 2020-06-05
      • 2017-09-30
      • 2014-03-16
      • 2018-07-20
      相关资源
      最近更新 更多