在Heroku同应用中部署WSGI HTTP与ASGI WebSocket的问题求助
在Heroku上同时处理Django应用的WebSocket(django-channels)与HTTP请求问题
现状描述
我目前在Heroku部署Django应用,用Gunicorn处理常规HTTP请求、Celery处理后台任务,这两部分运行正常,但WebSocket服务完全无法工作。本地用Postman测试WebSocket端点正常,但部署到Heroku后调用该端点无任何日志输出(执行heroku logs -t -d websocket看不到内容)。
我用Django-channels搭配ASGI,尝试过Daphne和uvicorn作为WebSocket服务器,但服务始终停滞。查阅资料后怀疑是Heroku对多端口支持的问题,想请教解决办法。
有问题的Procfile配置
gunicorn my_proj.wsgi worker: celery -A my_proj.celery_app worker websocket: daphne my_proj.asgi:application --port 8001 --bind 0.0.0.0 -v2
已验证可行但不符合需求的配置
以下配置能正常运行,但会让所有HTTP请求都通过ASGI处理,而我不想把简单HTTP端点都切换到ASGI:
web: daphne logistics_service.asgi:application --port $PORT --bind 0.0.0.0 -v2 worker: celery -A logistics_service.celery_app worker
备选方案与求助
我考虑了两种方向:
- 使用Supervisor这类进程管理器在单个dyno里同时运行Gunicorn和Daphne
- 在同一流水线中创建单独的WebSocket应用
想请教各位Heroku资深用户,你们在实际场景中是怎么处理这类需求的?求具体建议。
相关代码文件
asgi.py
django_asgi_app = get_asgi_application() application = ProtocolTypeRouter({ # "http": django_asgi_app, "websocket": URLRouter([ path(r"chat/<str:room_name>/", WSConsumer.as_asgi()), ]) })
WebSocket Consumer类
WSConsumer类继承自AsyncWebsocketConsumer:
from channels.generic.websocket import AsyncWebsocketConsumer class WSConsumer(AsyncWebsocketConsumer): ...
系统推送WebSocket通知的逻辑
我们的通知逻辑在视图中实现,无需额外暴露端点,代码示例:
from channels.layers import get_channel_layer from asgiref.sync import async_to_sync def send_ws_notification(room_name, **kwargs): channel_layer = get_channel_layer() async_to_sync(channel_layer.group_send)(room_name, {"type": "notification", "data": kwargs})
内容的提问来源于stack exchange,提问作者genikiwi35
相关产品推荐
相关产品推荐

