Django现在在Heroku中使用ASGI + WSGI工作通道

时间:2019-05-30 21:20:03

标签: django postgresql heroku redis django-channels

我正在尝试使用Channels(V.2)设置Django + Heroku应用程序。 我尝试按照所有教程进行操作,但大多数教程未更新。 应用必须对HTTP请求使用WSGI,对Websockets请求使用ASGI。 到目前为止,我发现它几乎可以正常工作,最后缺少的部分是websockets端点对于Web应用程序可见。 此时,每当我尝试创建新的Websocket时:

  

WebSocket握手过程中的错误:意外的响应代码:404

以下是设置:

ASGI_APPLICATION = 'app_xxx.routing.application'
ASGI_THREADS = 5
WSGI_APPLICATION = 'app_xxx.wsgi.application'

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            'hosts': [os.environ.get('REDIS_URL')],
        },
    },
}

这是Procfile:

web: gunicorn app_xxx.wsgi --log-file -
web2: daphne app_xxx.asgi:channel_layer --port $PORT --bind 0.0.0.0 -v2
worker: python manage.py runworker channel_layer -v2

这是asgi:

import os
from channels.layers import get_channel_layer

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app_xxx.settings")
channel_layer = get_channel_layer()

以下是路由:

from channels.routing import ProtocolTypeRouter, URLRouter, ChannelNameRouter
from django.urls import path
from apps.booking.consumers import BookingConsumer

application = ProtocolTypeRouter({
    "websocket": URLRouter([
        path('ws/booking_review/<room_name>', BookingConsumer),
    ]),
})

1 个答案:

答案 0 :(得分:0)

您应该运行ASGI应用程序,而不是通道层。您的ASGI_APPLICATION设置应指向routing.py或将其内容移至asgi.py并指向它。使用当前配置,您的Procfile应该如下所示:

web: gunicorn app_xxx.wsgi --log-file -
web2: daphne app_xxx.routing:application --port $PORT --bind 0.0.0.0 -v2
worker: python manage.py runworker channel_layer -v2

检查文档deployment page以获得更多详细信息