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

Django Channels在Postman中连接失败,HTML端正常求助

问题分析与解决方法

核心原因

你的WebSocket连接被拒绝,大概率是两个环节的限制导致:

  1. AllowedHostsOriginValidator 验证失败:Postman发起WebSocket请求时默认不会携带Origin请求头,而这个中间件会校验请求的Origin是否在Django的ALLOWED_HOSTS配置中,无Origin头会直接被拒绝。
  2. AuthMiddlewareStack 认证拦截:这个中间件会要求请求携带有效的用户认证信息(比如session cookie),Postman默认不会带上Django的认证凭证,导致连接被拦截。

分步解决方案

方案1:临时绕过验证(仅用于测试)

如果只是测试WebSocket功能,可以暂时移除AllowedHostsOriginValidator和AuthMiddlewareStack,简化asgi.py配置:

django_asgi_app = get_asgi_application()

import digital_signage.playlist_management.routing

application = ProtocolTypeRouter(
    {
        "http": django_asgi_app,
        "websocket": URLRouter(digital_signage.playlist_management.routing.websocket_urlpatterns),
    }
)

修改后重启服务,再用Postman连接测试。

方案2:适配Postman的请求配置(推荐用于测试)

  1. 添加Origin请求头:在Postman的WebSocket请求头里手动添加Origin: http://127.0.0.1:8000,确保这个值在Django配置的ALLOWED_HOSTS列表中。
  2. 携带认证凭证:如果你的WebSocket需要用户认证,先通过Postman的HTTP请求登录Django后台,获取session cookie,然后在WebSocket请求的Headers里添加Cookie头,值为登录后的session cookie内容。

方案3:生产环境适配配置

如果要兼顾HTML客户端和第三方客户端(如Postman),可以:

  • 针对WebSocket路由单独配置认证逻辑:在consumer的connect方法里判断是否需要认证,或者修改路由的中间件,给不需要认证的WebSocket路径跳过AuthMiddlewareStack。
  • 调整AllowedHostsOriginValidator逻辑:允许无Origin头的请求,或者抓包获取Postman实际发送的Origin(有时是chrome-extension://<id>格式),将其加入ALLOWED_HOSTS。

验证步骤

修改配置或请求头后,重启Django服务,再次用Postman发起WebSocket连接,查看Django日志是否显示WebSocket ACCEPT,若显示则连接成功。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:55:31