首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获得一个"Django只能处理ASGI/HTTP连接,而不能处理websocket。“在heroku上托管ASGI时出错?

获得一个"Django只能处理ASGI/HTTP连接,而不能处理websocket。“在heroku上托管ASGI时出错?
EN

Stack Overflow用户
提问于 2021-07-02 20:09:06
回答 1查看 1.3K关注 0票数 1

在StackOverflow和Youtube上翻阅每一个问题,寻找答案。我正在Heroku上通过Django通道部署WSGI和ASGI/websockets。它在当地工作,但在生产过程中给我带来了麻烦。

设置

这是我的原始文件:

代码语言:javascript
复制
web: daphne API.asgi:application --port $PORT --bind 0.0.0.0 -v2
worker: python manage.py runworker background -v2

Settings.py:

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

asgi.py:

代码语言:javascript
复制
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:

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

问题/日志

Heroku在连接到websocket时记录:

代码语言:javascript
复制
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函数按预期工作。

我试过的

如果有人知道我能在这里做什么,我会很感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-02 20:39:01

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

您需要的是用一个定义每个协议的服务方式的ProtocolTypeRouter替换ProtocolTypeRouter-- "http“转到django ASGI应用程序,"websocket”转到您的用户路由。

查看一下通道文档中的部署部分。您的asgi.py可能是这样的(我没有包括您的消费品进口):

代码语言:javascript
复制
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()
    })
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68230777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档