python发送数据到web页
作者:探索 来源:休闲 浏览: 【大 中 小】 发布时间:2026-10-17 06:13:08 评论数:
我有个朋友做量化交易,发送每天盯盘盯到眼睛发酸。数据他最大的发送痛点不是策略失效,而是数据想把Python算出来的实时信号推送到手机上的网页看板。他试过用邮件,发送延迟太高;用微信机器人,数据接口不稳定。发送最后我丢给他一段二十行的数据代码,问题就解决了——用Python内置的发送HTTP服务器往网页推数据。
别想复杂了。数据不需要Flask,发送不需要Django,数据连第三方库都不用装。发送Python标准库里的数据http.server模块就能干这事。核心逻辑就一句话:把网页当文件一样写出去,发送只不过这个文件是动态生成的。
from http.server import BaseHTTPRequestHandler, HTTPServer import json data_store = { "price": 0, "volume": 0} class Handler(BaseHTTPRequestHandler): def do_GET(self): if self.path == '/data': self.send_response(200) self.send_header('Content-Type', 'application/json') self.end_headers() self.wfile.write(json.dumps(data_store).encode()) else: self.send_response(200) self.send_header('Content-Type', 'text/html') self.end_headers() html = '''<html><body> <h1>实时价格</h1> <div id="price">--</div> <script> setInterval(() => { fetch('/data').then(r => r.json()).then(d => { document.getElementById('price').innerText = d.price; }); }, 1000); </script> </body></html>''' self.wfile.write(html.encode()) if __name__ == '__main__': server = HTTPServer(('0.0.0.0', 8000), Handler) print('服务器跑起来了,访问 http://localhost:8000') server.serve_forever() 这段代码干了三件事:启动一个监听8000端口的服务器,网页请求根路径时返回一个带JavaScript的HTML页面,网页里的JS每秒去请求一次/data接口拿最新数据。你的交易策略只需要更新那个data_store字典就行。
我实际用的时候踩过一个坑——浏览器缓存。第一次改完代码刷新页面,看到的是旧数据,气得差点砸键盘。后来发现是浏览器把HTML页面缓存了,加个Cache-Control: no-store响应头就好。这种小问题不遇到一次根本记不住。
还有并发问题。如果策略脚本是多线程的,直接改data_store可能造成数据错乱。我当时的做法是给字典加个锁,或者干脆用queue.Queue,生产者往里放数据,HTTP处理器从队列里取最新一条。简单粗暴但有效。
这套方案能撑多大流量?别指望它扛住高并发。我自己测过,本地跑五个浏览器标签页同时刷新,CPU占用率不到5%。但你要是开一百个连接,Python单线程服务器就开始卡了。够用就好,别贪心。
说实话,用这种原始方式做数据推送,最大的好处是可控。没有框架的黑魔法,所有逻辑摊在眼前,出了bug一眼就能定位。我甚至见过有人用这个思路做家庭监控面板,把树莓派上采集的温湿度数据推给手机看。那个老哥还加了Basic Auth认证,虽然代码丑了点,但实用啊。
数据推送的方向反一反也成立。你在网页上点个按钮,Python这边收到POST请求就执行某个函数。比如远程开机、定时任务触发,都是同样的路子。只要把do_GET换成do_POST,再解析一下请求体就行。
最后提醒一句,这个方案只适合内网或者个人使用。真要部署到公网,还是得用Nginx转发加SSL证书。不过话说回来,如果只是自己调试用,Python这二十行代码比任何重型框架都来得痛快。写代码有时候就是这样,绕开那些花哨的工具,回归最底层的HTTP协议,反而更接近问题的本质。
