一、项目场景简介
许多 Python 系统工具或运维脚本在运行过程中有大量实时日志、状态数据或执行反馈。如果这些信息只能输出在终端窗口中,不利于远程查看、协同开发或可视化分析。
本项目目标是实现:
二、项目结构设计
bash复制编辑realtime_dashboard/
├── cli.py # 命令入口:支持插件执行├── server.py # WebSocket + Flask 服务├── ws_handler.py # 推送通道处理├── modules/
│ ├── base.py # 模块接口│ ├── downloader.py # 示例任务│ └── cleaner.py # 示例任务├── frontend/
│ ├── index.html # 前端页面│ └── ws.js # WebSocket JS 逻辑└── utils/logger.py # 日志流重定向
三、终端工具入口(cli.py)
python复制编辑import sysimport importlibfrom utils.logger import start_loggingdef run_module(module_name, *args):
mod = importlib.import_module(f"modules.{module_name}") if hasattr(mod, 'run'):
start_logging()
mod.run(*args) else: print("模块缺少 run() 入口")if __name__ == "__main__": if len(sys.argv) < 2: print("用法: python cli.py 模块名 [参数]") else:
run_module(sys.argv[1], *sys.argv[2:])
四、日志重定向到 WebSocket(utils/logger.py)
python复制编辑import sysfrom ws_handler import broadcastclass LogRedirector: def write(self, msg):
msg = msg.strip() if msg:
broadcast(msg) def flush(self): passdef start_logging():
sys.stdout = LogRedirector()
sys.stderr = LogRedirector()
所有通过 print()
的输出都会实时发送到所有连接的前端客户端。
五、任务模块示例(modules/downloader.py)
python复制编辑import timedef run(url="http://example.com"): print(f"开始下载:{url}") for i in range(5): print(f"[{i+1}/5] 正在下载...")
time.sleep(1) print("下载完成。")
可轻松替换为任意爬虫、IO 密集型任务、系统处理任务等。
六、WebSocket 处理器(ws_handler.py)
python复制编辑import asyncio
clients = set()async def handle_ws(ws, path):
clients.add(ws) try: async for msg in ws: pass # 此例前端只接收,不发送
finally:
clients.remove(ws)def broadcast(message): for ws in clients.copy():
asyncio.run_coroutine_threadsafe(ws.send(message), ws.loop)
七、WebSocket + HTTP 服务(server.py)
python复制编辑import asyncioimport threadingimport aiohttpfrom aiohttp import webfrom ws_handler import handle_wsimport osdef start_ws_server():
app = web.Application()
app.router.add_get("/ws", handle_ws)
web.run_app(app, port=8765)def start_flask_server(): from flask import Flask, send_from_directory
app = Flask(__name__, static_folder="frontend") @app.route("/") def index(): return send_from_directory("frontend", "index.html") @app.route("/<path:path>") def static_files(path): return send_from_directory("frontend", path)
app.run(port=5000)def start_servers():
threading.Thread(target=start_ws_server, daemon=True).start()
threading.Thread(target=start_flask_server, daemon=True).start()if __name__ == "__main__":
start_servers() input("服务已启动,按回车退出...
")
八、前端页面(frontend/index.html)
html复制编辑<!DOCTYPE html><html><head> <title>日志面板</title> <style>
body { font-family: monospace; background: #111; color: #0f0; } #log { height: 90vh; overflow-y: scroll; border: 1px solid #444; padding: 10px; } </style></head><body><h2>实时日志</h2><div id="log"></div><script src="ws.js"></script></body></html>
九、WebSocket JS 客户端(frontend/ws.js)
javascript复制编辑const log = document.getElementById("log");const ws = new WebSocket("ws://localhost:8765/ws");
ws.onmessage = (event) => { let line = document.createElement("div");
line.textContent = event.data;
log.appendChild(line);
log.scrollTop = log.scrollHeight;
};
十、运行流程与测试
启动服务器:
bash复制编辑python server.py
启动一个终端命令:
bash复制编辑python cli.py downloader
浏览器访问:
arduino复制编辑http://localhost:5000
将实时看到输出内容。
十一、扩展方向
功能扩展 | 描述 |
---|
前端命令触发后端运行 | 使用 WebSocket 发送命令并在服务器启动任务 |
多任务并发运行状态 | WebSocket 结构化发送 JSON,前端多任务显示 |
日志历史缓存 | 存储最近日志于 Redis 或文件,支持历史查询 |
鉴权机制 | 限制特定 IP 或需登录后查看日志 |
多前端样式支持 | 增加图形化状态柱状图、折线图 |
热插拔模块显示 | 前端可选不同模块发起运行 |
十二、总结
本项目构建了一个:
适用于:
自动化任务监控面板
内网远程调试工具
日志分析可视化平台
后台服务实时状态反馈系统
相关阅读资料出处资料来源内容参考延伸阅读推荐链接相关信息参考内容推荐资料详细内容更多内容查看详情点击查看深入了解官方资料资料链接信息来源阅读更多文献出处内容链接数据出处技术参考案例来源实证依据报告链接研究链接统计数据数据来源分析资料理论出处论文参考说明详情调研内容支持数据背景文献学术出处报告来源文献引用权威来源实测数据延伸信息详情参考原文链接看原文阅读原文查看原帖原帖地址原始出处相关原文官方信息经验来源更多解析看更多网页资料实用信息入门参考指南文档推荐文章实例出处小贴士快速了解点此查看点击跳转原始链接网页参考本文依据内容跳转参考文档跳转详情网页原文链接详情点击去看点我查看来源说明资讯入口阅读跳转入门来源学习资料背景说明研究出处信息拓展衍生阅读延展资料链接来源原始内容探索原文获取信息查阅资料获取来源扩展阅读查阅详情来源详情页面跳转浏览原文详情链接说明出处内容补充参考原址附加链接来源页面点此了解更多原文阅读入口原始资料入口深度解析参考外部资源链接了解背景内容延伸阅读入口本文数据支持本文相关页面点这里查看快速跳转阅读此文查看推荐跳转页面继续阅读跳转参考文档外链参考去看看内容指引访问链接小贴士链接链接入口教程连接指向原文本文链接文献资料推荐参考同类资料引用内容来源参考实际出处文档入口学习入口阅读指引参考原文拓展来源额外参考内容引申来源位置附加内容网页跳转阅读地址档案出处数据支持引用来源上游资料查阅信息原页链接推荐说明提及内容本文参考链接参阅查阅出处内容输出内容路径深度阅读网文参考浏览入口原始输入本页推荐外链详情资讯路径源文链接关键参考相关文章指定链接点击链接原始地址学术链接网络出处案例出处支撑数据基础资料原始信息详细出处深入资料网页内容推荐原文网页参考资料来源跳转更多指引查阅页文本出处连接参考说明连接实用推荐点开阅读获取原始资料快速阅读链接内容引用来源实际案例参考对应来源跳转路径路径参考实际数据链接原页跳转外链地址跳转原始网页档案链接本站来源知识链接内容出自信息详情数据文献原本出处权威证据参考入口档案信息联网资料来源位置说明推荐文档详见资料继续查阅详情页资料页面原始说明原站内容内容追踪访问原页实例内容原文传送权威解读来自网页提及出处网页导航相关报道信息补充数据查看更多信息点资料一览内容载体报道来源说明原文知识参考网页地址点我阅读查阅指引点此前往看更多细节原始数据跳转资源文献详情外部详情更多原文入口链接数据详解文献链接学习资源内容导览查看原站链接出自进一步了解继续探索相关背景外部文档学习入口链接原始页面深层链接扩展查阅内部跳转链接点击查阅报告实时信息全文详情原始说明页来源入口内容浏览更多指向外链入口扫码进入专题链接实用出处历史内容扩展数据来源网页原页入口快捷入口相关跳转原数据页学术入口原内容页文档资源直接参考内容起点资源说明原链接地址通用资源链接访问推荐入口跳转原页引导信息快速查阅可用资料源地址网站跳转官方出品联网跳转阅读指令追踪链接深度链接阅读页面外链出自资料指南路径链接入口信息建议阅读实际引用外部入口阅读快线页面地址专业出处相关资源网页跳转口引导路径来源文档内容延展快速入口了解路径传送门详情输入转跳信息入口资料查阅连接支持出处深度出处内容通道地址传送页面查看权威指向教程出处精选内容网页引导网页原始平台跳转网页资源信息连接原始下载资料端口来源查阅内容窗口原文导航专栏参考链接地址信息链接浏览通道原始说明链接外链展示页面详情核心来源内容支持源指南页原页资料深入页面获取资料源头链接栏目内容进入页面访问信息参阅链接链接引导全文入口进入内容页跳转通道查阅平台内容访问网络入口页面支撑推荐查阅内容页面外部访问进入链接页上游引用信息导航文献访问链接按钮访问原网页访问入口外链原文页面资源平台资源深层资源资源地址扩展链接入口浏览更多内容推荐通道可查文献入口查看相关补充数据入口外链跳转链接快速通道查阅原数据跳转按钮信息通道外链页文章参考链接页内内容链接地址参考推荐信息链接学术内容入口原数据链接内容跳转入口参考页码链接文档页学术查阅页链接路径参考外链源页页面源数据推荐资源页网页延伸详细跳转官方信息页内容导向跳转数据页信息参考页内容传送外链目标页链接访问页指向内容页官方支持页页面说明来源访问资源页延展查阅入口入口导航页扩展网页链接内容资料页推荐内容页页面快速跳转官方页面入口链接来源页更多详情更多参考内容详细访问链接页内原文链接核心阅读链接快速导航入口页面跳转入口研究详情页查阅详细内容权威跳转入口官方参考路径页面入口说明内容列表入口引导页面链接实用资源页面数据说明页面源数据查看学术路径指引推荐查阅路径内容支持页面指向入口资源延伸路径指引详细阅读页外链访问入口来源资料页面内容详情传送入口链接说明链接说明页官方推荐路径路径延伸阅读查阅文档页引导内容入口核心入口链接内容补充页面查阅支持页跳转详细信息文献路径引导信息阅读页面查看内容页链接传送入口外部参考页相关参考页文档查看入口阅读原始页面页面资源入口内容平台页跳转入口页推荐入口页来源文献页官方入口链接指引查阅路径页内链接展示内容平台入口查阅资源页链接跳转指引页面地址入口权威查阅页面页面内容参考原始文献页深度内容入口数据资料页面原始资源页页面补充信息实际网页地址学术查阅入口平台信息入口原始信息路径页面参考来源实际链接地址链接入口参考参考文档页面外链说明入口链接直达深入查证原文详解相关页面来源路径页面跳出数据外链引导阅读深入来源原文入口实际地址原出处链接内容源头查阅通道额外信息资料端点推荐页码引用文献内容查询实时查阅官方通道直达资源导航链接延伸访问参考点击页面查阅数据访问平台原始快速查看内容接入跳转查看页面通道可用页面点击参考文章外链内容路由来源查找路径指引全部内容出处文献文章路径外链调用站外链接路径浏览外部文献链接指南链接点击入口深入文档出处路径学术页面说明路径页面文献网络文档文档查看页跳转参考页面导航链接关联链接查看文章引导说明数据页入口原始文档跳转链接浏览入口来源阅读页内容引导页推荐跳转可查页面官方引导跳转原数据可跳转文档平台入口页网站原始链接核心信息页原始站点延展入口页面外链内容展开更多内容查阅实际链接入口文章出处路径内容传导快速定位跳转入口链接页面入口跳转内容原始页文献来源页外链网页相关跳转链接文章链接地址阅读原页来源详细信息官方文档页页面说明链接深度查阅链接页面跳转信息文档信息源链接信息入口网页引导路径页面导向链接查阅起点网页资源链接指向阅读页快捷阅读外部链接跳转页面访问点官方链接源查阅推荐页路径地址查看跳转资源入口查看详细页跳转信息链接平台说明页外部页面访问阅读页地址链接页入口查阅内容来源内容详细页原始链接入口页面内容源查阅网页链接可读内容页文章说明链接内容浏览器入口外链浏览页网页推荐链接指向页面地址链接页面详情页面查阅通道查阅信息源平台内容跳转页面说明文本可阅读原文页面指引链接跳转外链入口数据推荐页文章引导页网页说明内容浏览内容入口内容出处导航信息原文页页面信息资源文档源头路径文章原页跳转网页地址链接页面参考资源内容跳出页链接定位路径查阅内容平台引导参考页面页面资源查询内容导览页链接内容地址页面导向信息内容站外入口阅读文章页页面平台入口外链跳转通道页面参考入口入口跳转页引导文献页数据查阅页页面通道入口可跳转平台实时外链路径链接外部资源页面起始链接参考网页内容网页内容跳转文章延伸页内容查找入口引导跳转信息跳转资源页站外资源查看资料原始链接文献通道入口推荐访问链接文章外跳入口页面数据通道可跳转信息页路径入口说明页面源文档数据延伸链接页面原路径引用说明入口跳转路径源页面说明内容页面通行地址数据查阅地址可参考原页页面说明文章内容路径推荐跳转资源页面引导页面信息页面参考导向入口跳转说明文档浏览地址页面跳转说明页面内容详情内容外部路径网页原文说明内容查找页平台外链资源文献平台入口路径导航链接页面跳出内容外链导向页网页导航资源原始资料页面信息页面链接内容导向路径页面指引地址路径查看入口内容查阅地址页面推荐资源网页地址跳转原始入口说明路径说明页面入口信息地址页面通道资源可跳转文献实用页面链接页面内容引导页面引导跳转跳转页面推荐参考链接导航页面外链内容可阅读内容页页面推荐信息页面延伸内容内容站外链接页面站外跳转页面参考信息页面外跳路径文档跳转说明网页推荐跳转原始资料路径内容路径跳转页面内容通道路径内容浏览页面内容起点页面说明路径文章平台入口页面数据查阅页面数据来源文档通道路径文章了解详情页访问详情资料跳转页了解入口资源数据链接原文访问原文原始通道内容地址页面内容引用资料阅读路径跳转入口说明平台原文页面数据说明内容入口资料源头平台通道路径平台信息源头页面导向说明页面原文内容跳转内容地址详情资源详情入口参考浏览页面源地址页页面参考引导详情资料平台内容原始引用路径阅读详情入口路径通道信息说明资源地址内容引导入口链接资料入口文档访问资源数据页面地址资料文档参考通道资源了解数据路径数据信息参考导向页面源平台页参考资源内容引导页面文档资料内容内容数据了解页面平台路径页面入口路径入口地址入口链接说明引用信息页面说明
扫码关注5G通信官方公众号,免费领取以下5G精品资料
1、回复“YD5GAI”免费领取《中国移动:5G网络AI应用典型场景技术解决方案白皮书》
2、回复“5G6G”免费领取《5G_6G毫米波测试技术白皮书-2022_03-21》
3、回复“YD6G”免费领取《中国移动:6G至简无线接入网白皮书》
4、回复“LTBPS”免费领取《《中国联通5G终端白皮书》》
5、回复“ZGDX”免费领取《中国电信5G NTN技术白皮书》
6、回复“TXSB”免费领取《通信设备安装工程施工工艺图解》
7、回复“YDSL”免费领取《中国移动算力并网白皮书》
8、回复“5GX3”免费领取《 R16 23501-g60 5G的系统架构1》