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

Django Channels使用Daphne正常,用Uvicorn/Gunicorn出现WebSocket 400错误如何解决

Django Channels Uvicorn启动WebSocket 400错误排查方案
  • 安装完整Uvicorn依赖
    基础版uvicorn缺少WebSocket完整支持组件,需安装standard版本:
    pip install uvicorn[standard] gunicorn

  • 调整Django配置项
    Uvicorn会严格透传请求头触发Django/Channels校验,在settings.py中补充如下配置:

# 必须配置允许访问的主机,DEBUG=False时必填
ALLOWED_HOSTS = ["127.0.0.1", "localhost"]
# 信任本地请求源,避免CSRF校验拦截
CSRF_TRUSTED_ORIGINS = ["http://127.0.0.1:8000", "http://localhost:8000"]

# Channels 4.x+ 配置示例,测试环境可放宽Origin限制,生产环境替换为实际业务域名
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels.layers.InMemoryChannelLayer",
        "CONFIG": {
            "allow_origins": ["*"],
        },
    }
}
  • 核对asgi.py配置
    确保ASGI入口文件的WebSocket路由包裹了正确的Origin校验规则,示例参考:
import os
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator
from django.core.asgi import get_asgi_application
from your_app import routing

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AllowedHostsOriginValidator(
        URLRouter(routing.websocket_urlpatterns)
    ),
})
  • 调整启动命令参数
    指定绑定的IP和端口,避免默认绑定规则导致的访问异常:
    单Uvicorn启动:uvicorn project.asgi:application --host 0.0.0.0 --port 8000
    Gunicorn托管启动:gunicorn project.asgi:application -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000

内容的提问来源于stack exchange,提问作者dudulu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 18:06:04