Python 搭建简易HTTP服务

一、前言

日常开发、本地文件共享、临时传输场景中,我们需要快速搭建一个轻量HTTP服务,无需部署Nginx、Tomcat等重型服务。Python 提供了零依赖、开箱即用 的HTTP服务能力,既可以使用内置模块快速启动静态文件下载服务,也可以自定义代码实现浏览器可视化上传、下载、预览功能。

以下对比使用两种搭建方案:

  • 方案一:一行命令启动静态下载服务(极简、适合临时文件共享)

  • 方案二:自定义Python服务,支持浏览器上传+下载+文件列表预览(全能实用)

所有代码基于Python3.x,无需安装第三方库,原生内置,跨Windows/Linux/Mac系统通用。

二、方案一:一行命令启动极简文件下载服务

2.1 功能说明

使用Python内置http.server模块,快速将本地文件夹转为Web目录,浏览器可直接访问、预览、下载目录下所有文件,仅支持下载,不支持上传,适合临时文件共享。

2.2 启动命令

打开终端,进入需要共享的文件目录,执行对应命令:

Python3 通用命令
bash 复制代码
# 默认端口8000,监听所有网卡
python -m http.server 8000

# 自定义端口(例如9000)
python -m http.server 9000

2.3 访问方式

  • 本地访问:http://127.0.0.1:8000

  • 局域网访问:http://本机IP:8000(手机/其他电脑可访问)

2.4 优缺点

✅ 优点:零配置、一秒启动、无依赖、跨平台

❌ 缺点:仅支持文件下载/预览,不支持文件上传,无权限控制,仅适合临时使用

三、方案二:自定义HTTP服务

基于Python内置http.servercgi模块二次封装,实现完整功能:浏览器在线查看文件列表、点击下载文件、选择文件上传保存到本地,无需任何第三方依赖。

3.1 服务代码

新建文件 http_file_server.py,复制以下全部代码:

python 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Python 简易HTTP文件服务
功能:浏览器预览文件列表、文件下载、文件上传
无第三方依赖,Python3原生支持
"""
import os
import cgi
from http.server import BaseHTTPRequestHandler, HTTPServer

# 配置服务端口和文件存储根目录
SERVER_PORT = 8000
# 服务运行目录作为文件根目录
ROOT_DIR = os.getcwd()


class FileServerHandler(BaseHTTPRequestHandler):
    # 忽略日志输出,保持终端干净
    def log_message(self, format, *args):
        return

    # 渲染HTML页面模板
    def render_html(self, title, content):
        html = f"""
        <!DOCTYPE html>
        <html lang="zh-CN">
        <head>
            <meta charset="UTF-8">
            <title>{title}</title>
            <style>
                body {{font-family:微软雅黑; margin:20px;}}
                .box {{border:1px solid #eee; padding:20px; border-radius:8px; margin-bottom:20px;}}
                a {{color:#0066cc; text-decoration:none;}}
                a:hover {{text-decoration:underline;}}
                .file-item {{line-height:2;}}
            </style>
        </head>
        <body>
            <h2>{title}</h2>
            {content}
        </body>
        </html>
        """
        self.send_response(200)
        self.send_header("Content-type", "text/html; charset=utf-8")
        self.end_headers()
        self.wfile.write(html.encode("utf-8"))

    # 展示文件列表 & 上传表单页面
    def do_GET(self):
        # 拼接页面内容
        upload_form = """
        <div class="box">
            <h3>文件上传</h3>
            <form method="post" enctype="multipart/form-data">
                <input type="file" name="upload_file" />
                <button type="submit" style="padding:4px 12px; margin-left:10px;">上传文件</button>
            </form>
        </div>
        """

        # 遍历当前目录文件
        file_list = "<div class='box'><h3>文件列表(点击下载)</h3>"
        for file in os.listdir(ROOT_DIR):
            # 忽略py源码文件(可选,可删除)
            if file.endswith(".py"):
                continue
            file_path = os.path.join(ROOT_DIR, file)
            file_list += f'<div class="file-item"><a href="{file}" target="_blank">{file}</a></div>'
        file_list += "</div>"

        # 渲染页面
        self.render_html("Python文件上传下载服务", upload_form + file_list)

    # 处理文件上传请求
    def do_POST(self):
        try:
            # 解析上传文件
            form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={"REQUEST_METHOD": "POST"}
            )
            # 获取上传文件对象
            upload_file = form["upload_file"]
            file_name = upload_file.filename

            # 空文件判断
            if not file_name:
                self.render_html("上传失败", "<p>未选择任何文件!</p><a href='/'>返回首页</a>")
                return

            # 写入保存文件
            save_path = os.path.join(ROOT_DIR, file_name)
            with open(save_path, "wb") as f:
                f.write(upload_file.file.read())

            # 上传成功页面
            self.render_html("上传成功", f"<p>文件【{file_name}】上传成功!</p><a href='/'>返回首页</a>")
        except Exception as e:
            self.render_html("上传失败", f"<p>上传异常:{str(e)}</p><a href='/'>返回首页</a>")


if __name__ == "__main__":
    server = HTTPServer(("0.0.0.0", SERVER_PORT), FileServerHandler)
    print(f"✅ 文件服务启动成功")
    print(f"🔗 本地访问:http://127.0.0.1:{SERVER_PORT}")
    print(f"🔗 局域网访问:http://本机IP:{SERVER_PORT}")
    print(f"📂 文件根目录:{ROOT_DIR}")
    print("-" * 50)
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        server.server_close()
        print("❌ 服务已关闭")

3.2 启动服务

bash 复制代码
# 直接运行脚本
python http_file_server.py

3.3 核心功能

  1. 文件预览/下载:浏览器打开页面,自动列出当前目录所有文件,点击文件名直接下载

  2. 文件上传:页面选择本地文件,点击上传,自动保存到服务运行目录

  3. 跨设备访问:支持局域网手机、其他电脑访问上传下载文件

  4. 中文兼容:完美支持中文文件名、中文文件内容

四、服务使用方法

4.1 本地访问

浏览器输入:http://127.0.0.1:8000

4.2 局域网跨设备访问

  1. 查看本机电脑IP(Windows:ipconfig,Linux/Mac:ifconfig

  2. 同局域网设备(手机/其他电脑)访问:http://电脑IP:8000

  3. 无需配置防火墙放行,默认本地局域网可通

4.3 操作方式

  • 下载文件:页面文件列表点击对应文件,浏览器自动下载

  • 上传文件:点击选择文件 → 选中本地文件 → 点击上传,自动保存到服务目录

五、常见问题与注意事项

5.1 端口占用问题

若8000端口被占用,修改代码中 SERVER_PORT 为其他端口(如8080、9000)即可。

5.2 文件保存位置

所有上传的文件会自动保存到脚本运行的目录 ,可修改 ROOT_DIR 变量自定义存储路径。

5.3 安全说明

该服务为临时工具服务 ,无账号密码、无权限校验、无加密传输,禁止部署在公网,仅用于本地、局域网临时文件传输。

5.4 兼容性

兼容所有Python3.x版本,支持Windows、Linux、Mac系统,无需pip安装任何依赖。

六、两种方案对比

方案 上传功能 下载功能 部署难度 适用场景
方案一 不支持 支持 极低(1秒启动) 临时文件下载、静态资源共享
方案二 支持 支持 低(直接运行脚本) 局域网双向文件传输、临时上传下载工具
相关推荐
YG亲测源码屋1 小时前
java配置环境变量、jdk环境变量配置、java环境变量设置方法
java·开发语言
MIUMIUKK1 小时前
从语法层面,看懂 Python 的特殊处
java·开发语言·python
FlyWIHTSKY1 小时前
TS、TSX、JS、JSX 文件扩展名详解
开发语言·javascript·ecmascript
着迷不白1 小时前
第一部分:认识python
开发语言·python
hujinyuan201602 小时前
2026年3月 中国电子学会青少年软件编程(Python)三级考试试卷 真题及答案
java·python·算法
开开心心就好2 小时前
支持多显示器的Windows高效分屏工具
运维·python·科技·游戏·计算机外设·ocr·powerpoint
basketball6162 小时前
C++ 高级编程:2. 基本线程池实现
java·开发语言·c++
chao1898442 小时前
SGM(Semi-Global Matching)立体匹配算法 — C++ 实现
开发语言·c++·算法