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秒启动) 临时文件下载、静态资源共享
方案二 支持 支持 低(直接运行脚本) 局域网双向文件传输、临时上传下载工具
相关推荐
数字化转型分享点滴1 小时前
富士康、蓝思科技为何选择四化信息?MES制造执行系统的实践
python·科技
wling03011 小时前
vasp虚频计算-python脚本
开发语言·windows·python·vasp计算
魔镜前的帅比1 小时前
(开源项目)x-claw(总)
python·ai·rust·开源
郝学胜-神的一滴2 小时前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
xrandzj2 小时前
Python面向对象编程入门:类、实例、初始化与封装实践
开发语言·python
DLYSB_3 小时前
API 网关流量洪峰与突发 CC 攻击:我用 Go 写了个“现场物理防御哨兵”,把故障响应压缩到秒级
开发语言·后端·golang·报警灯
全麦面包 time展天4 小时前
瀚海拾贝(一)HTTP协议/IIS 原理及ASP.NET运行机制浅析【图解】
网络协议·http·asp.net
matlabgoodboy5 小时前
计算机毕设代做|Java Python Matlab APP 全套开发设计
java·python·课程设计
雨田言炎5 小时前
四、关于Qt项目需要知道的
开发语言·笔记·qt
用户8356290780515 小时前
Python Word 转 PDF 和 PDF 转 Word 指南
后端·python