将Django与通道和asgi部署到heroku

2024-05-29 05:42:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试更新我的Django Heroku服务器以运行asgi并使用WebSocket

我更新了设置,Procfile,asgi文件 但我似乎无法使用WebSocket,我得到了一个错误:

2020-08-20T12:55:16.708582+00:00 app[web.1]: 2020-08-20 12:55:16,708 INFO     "10.11.225.205" - - [18/Jan/1970:07:49:50 +0000] "GET /ws/camera_online/connect/ HTTP/1.1" 404 179 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"
2020-08-20T12:55:16.708835+00:00 app[web.1]: 2020-08-20 12:55:16,708 DEBUG    HTTP response complete for ['10.11.225.205', 15753]
2020-08-20T12:55:16.708954+00:00 app[web.1]: 10.11.225.205:15753 - - [20/Aug/2020:12:55:16] "GET /ws/camera_online/connect/" 404 179
2020-08-20T12:55:16.710071+00:00 heroku[router]: at=info method=GET path="/ws/camera_online/connect/" host=scr-rivendell.herokuapp.com request_id=faa1ffe7-1bbc-4906-a37c-c468a15b4131 fwd="5.102.193.183" dyno=web.1 connect=0ms service=8ms status=404 bytes=326 protocol=https
2020-08-20T12:56:16.356480+00:00 app[web.1]: 10.63.224.151:18254 - - [20/Aug/2020:12:56:16] "WSCONNECTING /ws/camera_online/connect/" - -
2020-08-20T12:56:16.356714+00:00 app[web.1]: 2020-08-20 12:56:16,356 DEBUG    Upgraded connection ['10.63.224.151', 18254] to WebSocket
2020-08-20T12:56:16.533805+00:00 app[web.1]: 2020-08-20 12:56:16,533 ERROR    Exception inside application: Django can only handle ASGI/HTTP connections, not websocket.
2020-08-20T12:56:16.533809+00:00 app[web.1]: Traceback (most recent call last):
2020-08-20T12:56:16.533809+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.8/site-packages/daphne/cli.py", line 30, in asgi
2020-08-20T12:56:16.533810+00:00 app[web.1]: await self.app(scope, receive, send)
2020-08-20T12:56:16.533811+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.8/site-packages/django/core/handlers/asgi.py", line 144, in __call__
2020-08-20T12:56:16.533812+00:00 app[web.1]: raise ValueError(
2020-08-20T12:56:16.533813+00:00 app[web.1]: ValueError: Django can only handle ASGI/HTTP connections, not websocket.
2020-08-20T12:56:16.534169+00:00 app[web.1]: 2020-08-20 12:56:16,533 INFO     failing WebSocket opening handshake ('Internal server error')
2020-08-20T12:56:16.534659+00:00 app[web.1]: 2020-08-20 12:56:16,534 WARNING  dropping connection to peer tcp4:10.63.224.151:18254 with abort=False: Internal server error
2020-08-20T12:56:16.535806+00:00 app[web.1]: 2020-08-20 12:56:16,535 DEBUG    WebSocket closed for ['10.63.224.151', 18254]
2020-08-20T12:56:16.535896+00:00 app[web.1]: 10.63.224.151:18254 - - [20/Aug/2020:12:56:16] "WSDISCONNECT /ws/camera_online/connect/" - -

服务器似乎将套接字视为HTTP而不是WebSocket

在本地服务器上,WebSocket工作正常

设置.py

ASGI_APPLICATION = Config.ASGI
CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [(env('REDIS_URL'), 6379)],
        },
    },
}

Procfile

web: gunicorn rivendell.wsgi:application --log-file - --log-level debug
web: daphne rivendell.asgi:application --port $PORT --bind 0.0.0.0 -v2
worker: python manage.py runworker channel_layer -v2

asgi.py

import os

import django
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rivendell.settings.settings')
django.setup()

application = get_asgi_application()

routing.py

from channels.routing import ProtocolTypeRouter, URLRouter

import farm_api.routing

application = ProtocolTypeRouter({
    'websocket':
        URLRouter(
            farm_api.routing.websocket_urlpatterns

        ),
})

Tags: djangopyimportapphttpwsapplicationconnect

热门问题