您现在的位置是:休闲 >>正文
简易web服务器
休闲27人已围观
简介简易web服务器 用 Python 写一个能跑的 web 服务器,核心代码不到 20 行。这不是教学演示,是我上周调试接口时随手搭的东西,结果发现它比想象中好用。 标准库里的 http.server ...
简易web服务器
用 Python 写一个能跑的简易 web 服务器,核心代码不到 20 行。简易这不是简易教学演示,是简易我上周调试接口时随手搭的东西,结果发现它比想象中好用。简易
标准库里的简易 http.server 模块直接提供了现成的类。你只需要继承 BaseHTTPRequestHandler,简易重写 do_GET 方法,简易剩下的简易交给系统。下面这段代码我放在 server.py 里,简易命令行敲 python server.py 就能启动:
from http.server import HTTPServer,简易 BaseHTTPRequestHandler class Handler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header('Content-Type', 'text/html; charset=utf-8') self.end_headers() self.wfile.write(b'<h1>It works</h1>') HTTPServer(('0.0.0.0', 8080), Handler).serve_forever() 跑起来后浏览器访问 localhost:8080,页面上就一行字。简易没有框架,简易没有依赖,简易连 requirements.txt 都不用建。简易
但真实场景不会这么简单。前端项目通常需要返回静态文件,比如 HTML、CSS、JS 和图片。我在 do_GET 里加了一段路径判断:如果请求的是 /,返回 index.html;否则把 self.path 拼到项目根目录下,用 open() 读文件。这里有个坑——路径穿越攻击。用户请求 /../../etc/passwd 时,如果不做校验,服务器会把系统文件吐出去。解决办法是用 os.path.abspath 把最终路径规范化,再检查它是否以项目根目录开头。我见过至少三个内部工具忘了这一步。
处理 POST 请求也不复杂。重写 do_POST,从 self.rfile 读取 Content-Length 指定的字节数,解析 JSON 或表单数据。我拿它做过一个临时的 webhook 接收器,接收 GitHub 的推送事件,打印出 commit 信息。延迟在 5 毫秒以内,比 Flask 开发服务器还快——毕竟没有中间件和路由匹配的开销。
并发是个问题。HTTPServer 默认单线程,一个请求处理不完,下一个就得等着。如果某个接口调用了外部 API 卡住 3 秒,整个服务就阻塞 3 秒。换成 ThreadingHTTPServer 就行,Python 3.7 之后标准库自带。每个请求开一个线程,适合 I/O 密集的场景。但线程数没有上限,压测时开几百个线程会把内存吃光。生产环境肯定不能用这个,不过内部工具、原型验证、本地调试,它完全够用。
日志默认打到 stderr,格式是 127.0.0.1 - - [时间] "GET / HTTP/1.1" 200 -。我习惯重写 log_message 方法,加上响应时间和请求体大小。有一次排查前端为什么加载慢,发现某个 JSON 接口返回了 2MB 数据,日志里一目了然。
这个简易服务器最大的价值是“透明”。你知道每一行代码在做什么,没有魔法。Flask 的 @app.route 背后是 Werkzeug 的路由表,Django 的 ORM 背后是复杂的查询构建器。而这里,请求进来,你决定返回什么。适合学习 HTTP 协议,也适合快速验证想法。我甚至用它做过一个局域网文件共享工具,加上目录列表和下载链接,总共 60 行代码。
当然,别把它暴露在公网。没有 HTTPS,没有请求限流,没有安全头。它就是一个工具,像螺丝刀一样——用对地方就行。
Tags:
上一篇:csgo开箱网站官网
下一篇:网站建设的网络
相关文章
个人实验总结
休闲我把三块磁铁扔进了一个装着铁粉的玻璃罐里。罐子里的铁粉瞬间竖立起来,沿着磁力线排成规则的放射状图案。那一刻我意识到,课本上画的那些虚线,远没有实物来得震撼。 这学期个人实验课,我选了“磁场可视化”这个 ...
【休闲】
阅读更多微信支付漏洞
休闲2023年11月,广州一个做服装批发生意的老板老陈,在凌晨两点收到一条微信支付到账提醒:18450元。他翻了个身继续睡。第二天早上打开手机,发现那笔钱确实进了零钱账户,但对应的订单——一个陌生ID拍的 ...
【休闲】
阅读更多域名投资已经不存在了
休闲去年秋天,我在一个域名论坛上看到有人挂出“qiyewang.com”这个域名,标价八千块。挂了大半年,没人问。后来降到三千,还是没人要。最后他发帖说,谁续费谁拿走,自己不想再往里搭钱了。评论区一片唏嘘 ...
【休闲】
阅读更多