Python 内置的 HTTP 服务

Python 内置的 HTTP 服务

文章目录

  • [Python 内置的 HTTP 服务](#Python 内置的 HTTP 服务)

Python 内置的 HTTP 服务,这是一个非常方便的功能,尤其适合快速共享文件、本地开发和简单的 API 测试。

Python 启动 HTTP 服务主要依赖 http.server 模块(在 Python 3 中)或 SimpleHTTPServer 模块(在 Python 2 中)。

我们将主要以更现代的 Python 3 为例进行讲解。


1. 最简单的方式:命令行一键启动

这是最常用、最快捷的用法,无需编写任何 Python 代码。它会把你当前所在的目录作为网站根目录,启动一个文件服务器。

Python 3

打开你的终端(或 Windows 的 CMD/PowerShell),进入你想要共享的文件夹,然后运行:

bash 复制代码
# 默认使用 8000 端口
python -m http.server

# 你也可以指定一个端口,比如 8888
python -m http.server 8888

# 如果你想让局域网内的其他设备也能访问,可以绑定到 0.0.0.0
python -m http.server --bind 0.0.0.0 8888

启动后,你会看到类似 Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... 的提示。

现在,打开浏览器访问:

  • 本机访问 : http://localhost:8000http://127.0.0.1:8000
  • 局域网其他设备访问 : http://<你的电脑IP地址>:8000

你会在浏览器上看到当前目录的文件和文件夹列表,可以点击下载。

Python 2

如果你仍在使用 Python 2,命令稍有不同:

bash 复制代码
# 默认使用 8000 端口
python -m SimpleHTTPServer

# 指定端口 8888
python -m SimpleHTTPServer 8888

2. 在 Python 脚本中启动

如果你需要更多的控制,或者想把 HTTP 服务嵌入到你的应用程序中,可以在 Python 脚本中启动它。

这是一个基本的脚本,功能和命令行版本完全一样。

python 复制代码
import http.server
import socketserver

# 定义端口号
PORT = 8000

# 创建一个简单的请求处理器,SimpleHTTPRequestHandler 会处理 GET 和 HEAD 请求,
# 并将当前目录下的文件作为响应。
Handler = http.server.SimpleHTTPRequestHandler

# 使用 with 语句可以确保服务器在程序结束时被正确关闭
with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print(f"服务器正在运行,端口号为: {PORT}")
    print(f"请在浏览器中访问 http://localhost:{PORT}")
    
    # 启动服务器,它会一直运行,直到你手动停止(例如按 Ctrl+C)
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("\n服务器正在关闭...")
        httpd.server_close()

如何运行:

  1. 将以上代码保存为 my_server.py
  2. 在终端中运行 python my_server.py
  3. 效果和命令行方式一样。

3. 高级用法:自定义处理器 (Handler)

http.server 最强大的地方在于你可以自定义如何处理请求。默认的 SimpleHTTPRequestHandler 只能提供文件服务,但我们可以通过继承 BaseHTTPRequestHandler 来编写自己的逻辑。

例如,创建一个简单的 API,当访问 /api 时返回一个 JSON 数据。

python 复制代码
import http.server
import json

# 定义主机和端口
HOST = "localhost"
PORT = 8000

# 自定义请求处理器类,继承自 BaseHTTPRequestHandler
class MyAPIHandler(http.server.BaseHTTPRequestHandler):
    
    # 处理 GET 请求
    def do_GET(self):
        # 路由:根据请求的路径 (self.path) 决定做什么
        if self.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'))
            
        elif self.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:
            # 如果路径未找到,返回 404
            self.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()
    except KeyboardInterrupt:
        print("\n服务器正在关闭...")
        server.server_close()
        print("服务器已关闭。")

如何运行和测试:

  1. 保存为 api_server.py 并运行 python api_server.py
  2. 访问 http://localhost:8000/ 会看到欢迎信息。
  3. 访问 http://localhost:8000/api 会看到 JSON 响应。
  4. 访问 http://localhost:8000/other 会得到 404 错误。

适用场景与注意事项

适用场景
  1. 快速文件共享:在局域网内临时共享文件给同事或自己的其他设备,非常方便。
  2. 本地 Web 开发:在没有后端框架的情况下,快速预览 HTML/CSS/JavaScript 静态页面。
  3. 简单的 API 原型/Mock:为前端开发提供临时的、可用的 API 接口。
  4. 教学与演示:简单明了地展示 HTTP 协议的基本工作原理。
注意事项(非常重要!)
  1. 单线程http.server 默认是单线程的,一次只能处理一个请求。如果一个请求耗时很长,其他请求必须排队等待。
  2. 性能问题:它的性能远不如专业的 Web 服务器(如 Nginx, Apache)或 Web 框架(如 Flask, Django, FastAPI)。
  3. 安全风险 :它是一个纯 HTTP 服务器,不处理 HTTPS。同时,它没有任何安全加固,将整个目录暴露在网络上可能存在风险。绝对不要在生产环境或不受信任的网络上使用它!
  4. 功能有限:它没有路由、模板引擎、数据库集成等高级功能。对于复杂的应用,你应该选择 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 灵活,可完全控制请求和响应的逻辑
相关推荐
贺今宵9 小时前
安装java环境,安装jdk,jre,配环境win11
java·开发语言
qq_4783775159 小时前
python cut_merge video, convert video2gif, cut gif
java·前端·python
雾岛听蓝9 小时前
C++类和对象(三):核心特性与实战技巧
开发语言·c++
Pyeako9 小时前
机器学习--逻辑回归
人工智能·python·机器学习·逻辑回归
SmoothSailingT9 小时前
C#——Interface(接口)
开发语言·c#·接口
利刃大大9 小时前
【JavaSE】十九、JVM运行流程 && 类加载Class Loading
java·开发语言·jvm
Clarence Liu10 小时前
Go Context 深度解析:从源码到 RESTful 框架的最佳实践
开发语言·后端·golang
中年程序员一枚10 小时前
Python防止重复资源的链接mysql方法
开发语言·python·mysql
天宁10 小时前
pywebview窗口移动解决方案
python