这是一个非常方便的功能,特别适合于快速开发、测试、共享文件等场景,无需安装任何额外的 Web 服务器软件(如 Apache、Nginx)。
核心要点
-
它是什么? Python 内置了一个简单的、纯 Python 编写的 HTTP 服务器,它非常轻量级,功能有限,不适合用于生产环境,但对于本地开发和临时任务来说非常强大。
-
如何启动? 你只需要在命令行中使用 Python 的
-m标志来运行http.server模块即可。# Python 3 python -m http.server [端口号] # 如果你的系统默认是 Python 2 # python -m SimpleHTTPServer [端口号]
[端口号]是可选的,如果不指定,默认使用 8000 端口。- 服务器启动后,它会监听你指定的端口,等待客户端连接。
-
它在哪里运行? 服务器会在你当前所在的命令行目录下启动,这个目录被称为“根目录”或“文档根”(Document Root),所有通过这个服务器提供的文件,都相对于这个目录。
详细使用指南
基本用法:共享本地文件
这是最常见的用法,比如你想快速和同事分享一个文件夹里的文件。
步骤:
-
准备一个文件夹 假设你有一个名为
my_project的文件夹,里面有一些文件。my_project/ ├── index.html ├── styles.css └── script.js -
打开终端,进入该文件夹 使用
cd命令切换到my_project目录。# macOS / Linux cd /path/to/my_project # Windows cd C:\Users\YourUser\Documents\my_project
-
启动 Web 服务器 在该目录下运行以下命令:
# 使用 Python 3,默认端口 8000 python -m http.server
你会看到类似下面的输出,表示服务器已成功启动:
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... -
访问服务器
- 在同一台电脑上访问:打开你的网页浏览器,在地址栏输入
http://localhost:8000或http://127.0.0.1:8000,然后按回车。 - 从同一局域网内的其他设备访问:找到你电脑的 IP 地址(在 macOS/Linux 上用
ifconfig,在 Windows 上用ipconfig),假设你的 IP 是168.1.10,那么其他设备就可以通过http://192.168.1.10:8000来访问你共享的文件。
- 在同一台电脑上访问:打开你的网页浏览器,在地址栏输入
-
停止服务器 在运行服务器的终端窗口中,按
Ctrl + C即可停止服务器。
指定端口
8000 端口被占用,或者你想使用其他端口,可以轻松指定:
# 在 8080 端口启动服务器 python -m http.server 8080
指定绑定地址
默认情况下,服务器绑定到 0.0.0,这意味着它接受来自任何网络接口(包括本地 localhost 和局域网内其他 IP)的连接,如果你只想从本机访问,可以绑定到 0.0.1。
这可以通过环境变量 PYTHONHTTPSERVERSERVER_BIND_ADDRESS 来设置(Python 3.7+)。
在启动前设置环境变量
# Linux / macOS export PYTHONHTTPSERVERSERVER_BIND_ADDRESS=127.0.0.1 python -m http.server # Windows (Command Prompt) set PYTHONHTTPSERVERSERVER_BIND_ADDRESS=127.0.0.1 python -m http.server # Windows (PowerShell) $env:PYTHONHTTPSERVERSERVER_BIND_ADDRESS="127.0.0.1" python -m http.server
直接在命令行设置(Python 3.10+)
python -m http.server --bind 127.0.0.1
自定义目录索引
默认情况下,如果访问一个目录,服务器会生成一个包含该目录下所有文件的列表,你可以通过创建一个名为 index.html、index.htm 或 index.cgi 的文件来覆盖这个行为,当用户访问该目录时,服务器会优先显示你自定义的 index.html 文件。
高级用法与选项
处理 POST 请求(上传文件)
默认的 http.server 模块不能处理 POST 请求,Python 的标准库中有一个更强大的模块 http.server 的子模块 cgi(Common Gateway Interface),可以让你实现一个简单的文件上传功能。
这是一个稍微复杂的例子,展示了如何创建一个可以接收文件上传的表单。
步骤:
-
创建一个用于上传的 HTML 文件 (
upload.html)<!DOCTYPE html> <html> <head> <title>File Upload</title> </head> <body> <h1>Upload a file</h1> <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> </body> </html> -
创建一个 CGI 脚本 (
upload.cgi)这个脚本会处理表单提交的数据。
# upload.cgi # 确保这个文件有可执行权限 (chmod +x upload.cgi) import cgi import os import shutil # 设置保存上传文件的目录 UPLOAD_DIR = "uploads" # 确保上传目录存在 if not os.path.exists(UPLOAD_DIR): os.makedirs(UPLOAD_DIR) # 打印 HTTP 头部,必须以两个换行符结束 print("Content-Type: text/html") print() # 处理文件上传 try: form = cgi.FieldStorage() fileitem = form['file'] if fileitem.filename: # 获取文件名并清理路径 filename = os.path.basename(fileitem.filename) # 保存文件 filepath = os.path.join(UPLOAD_DIR, filename) with open(filepath, 'wb') as f: shutil.copyfileobj(fileitem.file, f) print(f"<p>File '{filename}' uploaded successfully.</p>") else: print("<p>No file was uploaded.</p>") except Exception as e: print(f"<p>Error: {e}</p>") -
启动 CGI 服务器
你需要使用
CGIHTTPRequestHandler而不是默认的HTTPRequestHandler。# 在包含 upload.html 和 upload.cgi 的目录下运行 python -m http.server --cgi 8000
访问
http://localhost:8000/upload.html,你就可以通过这个网页上传文件了,上传的文件会被保存在uploads子目录中。
重要注意事项
- 安全性:绝对不要将这个内置服务器暴露在公共互联网上!因为它没有任何身份验证、访问控制或安全加固,任何人只要知道你的 IP 地址和端口,就可以访问你电脑上指定目录下的所有文件,并尝试执行恶意脚本(如果目录下有
.py文件),它仅适用于受信任的网络环境(如本地局域网)。 - 性能:这个服务器是为单线程、低负载设计的,它不适合处理大量并发请求或作为生产环境的服务器。
- 功能限制:它不支持 HTTPS(加密连接)、URL 重写、虚拟主机等高级 Web 服务器功能。
| 功能 | 命令/方法 | 描述 |
|---|---|---|
| 基本启动 | python -m http.server |
在当前目录启动,监听 8000 端口 |
| 指定端口 | python -m http.server 8080 |
在 8080 端口启动服务器 |
| 仅本机访问 | python -m http.server --bind 127.0.0.1 |
(Python 3.10+) 只允许本地访问 |
| 文件上传 | python -m http.server --cgi |
启用 CGI 支持,可处理 POST 请求 |
| 停止服务 | Ctrl + C |
在终端中按下组合键 |
Python 的内置 Web 服务器是一个“瑞士军刀”,虽然小巧,但在很多紧急或临时的场合都能派上大用场,是每个 Python 开发者都应该掌握的实用工具。
