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秒启动) 临时文件下载、静态资源共享
方案二 支持 支持 低(直接运行脚本) 局域网双向文件传输、临时上传下载工具
相关推荐
ServBay18 小时前
9 个 Python 第三方库推荐,不用 AI 都好像多出一个团队
后端·python
用户83562907805118 小时前
如何使用 Python 添加和管理 Excel 批注(完整示例)
后端·python
用户83562907805118 小时前
使用 Python 管理 Excel 工作表:创建、复制、删除与重命名
后端·python
荣码1 天前
LangGraph多Agent协作:3个Agent干活比1个强,但我踩了4个坑
java·python
用户8356290780512 天前
Python 操作 PDF 附件:添加、查看与管理指南
后端·python
宇宙之一粟2 天前
乐企版式文件生成平台
java·后端·python
学测绘的小杨3 天前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
Goodbye3 天前
大模型无状态架构:从 HTTP 协议到 Harness AI 工程的深度解析
http
zzzzzz3103 天前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐3 天前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python