我正在尝试使用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),
]),
})
答案 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以获得更多详细信息