Python 内置的 HTTP 服务
文章目录
- Python 内置的 HTTP 服务
- 1. 最简单的方式:命令行一键启动
- Python 3
- Python 2
- 2. 在 Python 脚本中启动
- 3. 高级用法:自定义处理器 (Handler)
- 适用场景与注意事项
- 适用场景
- 注意事项(非常重要!)
- 总结
Python 内置的 HTTP 服务,这是一个非常方便的功能,尤其适合快速共享文件、本地开发和简单的 API 测试。
Python 启动 HTTP 服务主要依赖http.server模块(在 Python 3 中)或SimpleHTTPServer模块(在 Python 2 中)。
我们将主要以更现代的Python 3为例进行讲解。
1. 最简单的方式:命令行一键启动
这是最常用、最快捷的用法,无需编写任何 Python 代码。它会把你当前所在的目录作为网站根目录,启动一个文件服务器。
Python 3
打开你的终端(或 Windows 的 CMD/PowerShell),进入你想要共享的文件夹,然后运行:
# 默认使用 8000 端口python -m http.server# 你也可以指定一个端口,比如 8888python -m http.server8888# 如果你想让局域网内的其他设备也能访问,可以绑定到 0.0.0.0python -m http.server --bind0.0.0.08888启动后,你会看到类似Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...的提示。
现在,打开浏览器访问:
- 本机访问:
http://localhost:8000或http://127.0.0.1:8000 - 局域网其他设备访问:
http://<你的电脑IP地址>:8000
你会在浏览器上看到当前目录的文件和文件夹列表,可以点击下载。
Python 2
如果你仍在使用 Python 2,命令稍有不同:
# 默认使用 8000 端口python -m SimpleHTTPServer# 指定端口 8888python -m SimpleHTTPServer88882. 在 Python 脚本中启动
如果你需要更多的控制,或者想把 HTTP 服务嵌入到你的应用程序中,可以在 Python 脚本中启动它。
这是一个基本的脚本,功能和命令行版本完全一样。
importhttp.serverimportsocketserver# 定义端口号PORT=8000# 创建一个简单的请求处理器,SimpleHTTPRequestHandler 会处理 GET 和 HEAD 请求,# 并将当前目录下的文件作为响应。Handler=http.server.SimpleHTTPRequestHandler# 使用 with 语句可以确保服务器在程序结束时被正确关闭withsocketserver.TCPServer(("",PORT),Handler)ashttpd:print(f"服务器正在运行,端口号为:{PORT}")print(f"请在浏览器中访问 http://localhost:{PORT}")# 启动服务器,它会一直运行,直到你手动停止(例如按 Ctrl+C)try:httpd.serve_forever()exceptKeyboardInterrupt:print("\n服务器正在关闭...")httpd.server_close()如何运行:
- 将以上代码保存为
my_server.py。 - 在终端中运行
python my_server.py。 - 效果和命令行方式一样。
3. 高级用法:自定义处理器 (Handler)
http.server最强大的地方在于你可以自定义如何处理请求。默认的SimpleHTTPRequestHandler只能提供文件服务,但我们可以通过继承BaseHTTPRequestHandler来编写自己的逻辑。
例如,创建一个简单的 API,当访问/api时返回一个 JSON 数据。
importhttp.serverimportjson# 定义主机和端口HOST="localhost"PORT=8000# 自定义请求处理器类,继承自 BaseHTTPRequestHandlerclassMyAPIHandler(http.server.BaseHTTPRequestHandler):# 处理 GET 请求defdo_GET(self):# 路由:根据请求的路径 (self.path) 决定做什么ifself.path=='/':# 如果是根路径,就返回一个欢迎页面self.send_response(200)self.send_header('Content-type','text/html; charset=utf-8')self.end_headers()message="<h1>欢迎来到我的自定义服务器!</h1><p>尝试访问 <a href='/api'>/api</a></p>"self.wfile.write(message.encode('utf-8'))elifself.path=='/api':# 如果是 /api 路径,就返回一个 JSON 数据self.send_response(200)self.send_header('Content-type','application/json')self.end_headers()# 准备要返回的 JSON 数据response_data={'status':'success','message':'Hello from the API!','data':[1,2,3]}# 将 Python 字典转换为 JSON 字符串,并编码为字节流self.wfile.write(json.dumps(response_data).encode('utf-8'))else:# 如果路径未找到,返回 404self.send_error(404,"页面未找到 (Page Not Found)")# --- 启动服务器的代码 ---if__name__=="__main__":# 创建一个 TCP 服务器实例,绑定地址和自定义的处理器server=http.server.TCPServer((HOST,PORT),MyAPIHandler)print(f"服务器启动于 http://{HOST}:{PORT}")try:# 启动服务器,永久运行server.serve_forever()exceptKeyboardInterrupt:print("\n服务器正在关闭...")server.server_close()print("服务器已关闭。")如何运行和测试:
- 保存为
api_server.py并运行python api_server.py。 - 访问
http://localhost:8000/会看到欢迎信息。 - 访问
http://localhost:8000/api会看到 JSON 响应。 - 访问
http://localhost:8000/other会得到 404 错误。
适用场景与注意事项
适用场景
- 快速文件共享:在局域网内临时共享文件给同事或自己的其他设备,非常方便。
- 本地 Web 开发:在没有后端框架的情况下,快速预览 HTML/CSS/JavaScript 静态页面。
- 简单的 API 原型/Mock:为前端开发提供临时的、可用的 API 接口。
- 教学与演示:简单明了地展示 HTTP 协议的基本工作原理。
注意事项(非常重要!)
- 单线程:
http.server默认是单线程的,一次只能处理一个请求。如果一个请求耗时很长,其他请求必须排队等待。 - 性能问题:它的性能远不如专业的 Web 服务器(如 Nginx, Apache)或 Web 框架(如 Flask, Django, FastAPI)。
- 安全风险:它是一个纯 HTTP 服务器,不处理 HTTPS。同时,它没有任何安全加固,将整个目录暴露在网络上可能存在风险。绝对不要在生产环境或不受信任的网络上使用它!
- 功能有限:它没有路由、模板引擎、数据库集成等高级功能。对于复杂的应用,你应该选择 Flask、Django 或 FastAPI 等专业框架。
总结
| 用途 | Python 3 命令 | Python 2 命令 | 特点 |
|---|---|---|---|
| 快速文件服务 | python -m http.server [端口] | python -m SimpleHTTPServer [端口] | 简单快捷,一键启动,适合临时使用 |
| 脚本化服务 | http.server+socketserver | SimpleHTTPServer+SocketServer | 可编程,能集成到其他应用中 |
| 自定义API | 继承http.server.BaseHTTPRequestHandler | 继承SimpleHTTPServer.SimpleHTTPRequestHandler | 灵活,可完全控制请求和响应的逻辑 |