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
相关产品推荐
相关产品推荐

