You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:24:52