Django启动后台WebSocket客户端后无法访问127.0.0.1:8000如何解决
问题根因
你在Django AppConfig的ready方法中直接导入WebSocket客户端模块时,模块末尾的runwss()会直接执行,其中stream.run_forever()是阻塞式调用,会占满当前进程的执行逻辑,导致Django没有机会启动8000端口的HTTP监听服务,自然无法访问站点。
解决方案
- 第一步先修改WebSocket客户端文件,删除末尾直接调用的
runwss()代码,避免模块被导入时自动执行阻塞逻辑。 - 第二步修改AppConfig的
ready方法,将WebSocket客户端放到独立的守护线程中运行,避免阻塞Django主进程,参考代码如下:
from django.apps import AppConfig import threading import os class ServiceGetDataConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'service_get_data' def ready(self): # 避免开发环境runserver自动重载机制导致启动两次客户端 if os.environ.get('RUN_MAIN') != 'true': return import service_get_data.wss # 启动守护线程,Django退出时线程会自动销毁 ws_thread = threading.Thread( target=service_get_data.wss.runwss, daemon=True ) ws_thread.start()
- 开发环境启动服务时如果不需要代码自动重载,也可以直接加
--noreload参数启动:python manage.py runserver --noreload,即可避免重复启动WebSocket客户端的问题。 - 生产环境建议将WebSocket数据采集逻辑和Django Web服务拆分,作为独立进程单独部署(比如用systemd托管采集脚本),避免两者互相影响。
内容的提问来源于stack exchange,提问作者Kadiem Alqazzaz
相关产品推荐
相关产品推荐

