python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python搭建简易HTTP服务

基于Python搭建简易HTTP服务的两种方案

作者:曾阿伦

本描述介绍了两种基于Python的轻量级HTTP服务方案,方案一通过一行命令启动极简文件下载服务,适用于临时文件共享;方案二则支持文件上传下载、预览功能,适合局域网内文件传输需求,需要的朋友可以参考下

一、前言

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

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

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

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

2.1 功能说明

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

2.2 启动命令

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

Python3 通用命令

# 默认端口8000,监听所有网卡
python -m http.server 8000
# 自定义端口(例如9000)
python -m http.server 9000

2.3 访问方式

2.4 优缺点

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

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

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

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

3.1 服务代码

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

#!/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}" rel="external nofollow"  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 启动服务

# 直接运行脚本
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秒启动)临时文件下载、静态资源共享
方案二支持支持低(直接运行脚本)局域网双向文件传输、临时上传下载工具

以上就是基于Python搭建简易HTTP服务的两种方案的详细内容,更多关于Python搭建简易HTTP服务的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文