Django与uvicorn页面加载时出现`closing handshake failed`错误求助
核心错误原因
你遇到的ValueError: No application configured for scope type 'websocket'报错,是因为ASGI入口文件没有配置websocket类型的请求处理器,后续的连接关闭异常是该错误触发的次生问题。
解决方案
1. 修正asgi.py配置
你将websocket路由配置单独写在了routing.py中,但没有将该配置整合到ASGI入口中,替换你的asgi.py内容如下:
import os from channels.auth import AuthMiddlewareStack from channels.routing import ProtocolTypeRouter, URLRouter from django.core.asgi import get_asgi_application import chat.routing os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'twitch_chess.settings') application = ProtocolTypeRouter({ "http": get_asgi_application(), "websocket": AuthMiddlewareStack( URLRouter( chat.routing.websocket_urlpatterns ) ), })
修改完成后原单独的routing.py文件可删除,避免配置冲突。
2. 适配Heroku的Redis配置
你当前的CHANNEL_LAYERS默认连接本地Redis,Heroku环境下需要读取平台注入的Redis环境变量,修改settings.py的CHANNEL_LAYERS配置:
import os CHANNEL_LAYERS = { "default": { "BACKEND": "channels_redis.core.RedisChannelLayer", "CONFIG": { "hosts": [os.environ.get("REDIS_URL", ("127.0.0.1", 6379))], }, }, }
修改前请确认你已在Heroku应用后台安装了Redis插件,安装完成后平台会自动生成REDIS_URL环境变量。
3. 修正启动配置
检查项目根目录下的Procfile,将web启动命令修改为uvicorn启动ASGI应用的格式:
web: uvicorn twitch_chess.asgi:application --host 0.0.0.0 --port $PORT
4. 补充校验项
- 确认
channels已添加到settings.py的INSTALLED_APPS列表中 - 确认
chat/routing.py中存在websocket_urlpatterns变量,且路径匹配前端请求的/ws/ticks/规则,示例如下:
from django.urls import re_path from . import consumers websocket_urlpatterns = [ re_path(r'ws/ticks/$', consumers.TicksConsumer.as_asgi()), ]
以上配置全部修改完成后重新部署即可解决问题。
内容的提问来源于stack exchange,提问作者Brandon Slaght
相关产品推荐
相关产品推荐

