Python 简易 HTTP 服务器

Python 简易 HTTP 服务器(http.server)

http.server 是 socketserver.TCPServer 的子类,它在 HTTP 套接字上创建和监听,并将请求分派给处理程序。

Python3 内置标准模块。

通过执行如下命令创建一个最简单的 HTTP 服务器:

python 复制代码
python -m http.server # 服务器默认监听端口是 8000
python -m http.server 9000 # 支持自定义端口号
python -m http.server --bind 127.0.0.1 # 服务器默认绑定到所有接口,可以通过 -b/--bind 指定地址,如本地主机。
python -m http.server --directory /tmp/ # 服务器默认工作目录为当前目录,可通过 -d/--directory 参数指定工作目录。
python -m http.server --cgi # 可以通过传递参数 --cgi 启用 CGI 请求处理程序:

http.server 也支持在代码中调用,导入对应的类和函数即可。

python 复制代码
from http.server import SimpleHTTPRequestHandler
from http.server import CGIHTTPRequestHandler
from http.server import ThreadingHTTPServer
from functools import partial
import contextlib
import sys
import os

class DualStackServer(ThreadingHTTPServer):
    def server_bind(self):
        # suppress exception when protocol is IPv4
        with contextlib.suppress(Exception):
            self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
        return super().server_bind()


def run(server_class=DualStackServer,
        handler_class=SimpleHTTPRequestHandler,
        port=8000,
        bind='127.0.0.1',
        cgi=False,
        directory=os.getcwd()):
    """Run an HTTP server on port 8000 (or the port argument).

    Args:
        server_class (_type_, optional): Class of server. Defaults to DualStackServer.
        handler_class (_type_, optional): Class of handler. Defaults to SimpleHTTPRequestHandler.
        port (int, optional): Specify alternate port. Defaults to 8000.
        bind (str, optional): Specify alternate bind address. Defaults to '127.0.0.1'.
        cgi (bool, optional): Run as CGI Server. Defaults to False.
        directory (_type_, optional): Specify alternative directory. Defaults to os.getcwd().
    """

    if cgi:
        handler_class = partial(CGIHTTPRequestHandler, directory=directory)
    else:
        handler_class = partial(SimpleHTTPRequestHandler, directory=directory)

    with server_class((bind, port), handler_class) as httpd:
        print(
            f"Serving HTTP on {bind} port {port} "
            f"(http://{bind}:{port}/) ..."
        )
        try:
            httpd.serve_forever()
        except KeyboardInterrupt:
            print("\nKeyboard interrupt received, exiting.")
            sys.exit(0)

if __name__ == '__main__':
    run(port=8000, bind='127.0.0.1')
复制代码
server_class:服务器类
handler_class:请求处理类
port:端口
bind:IP
cgi:是否启用 CGI 请求处理程序
directory:工作目录

小型 web 项目在局域网内的预览

项目目录

html 复制代码
web:.
├─index.html
html 复制代码
index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    hello world
</body>
</html>

切换到目录 cd web,执行命令 python -m http.server,浏览器地址栏输入 localhost:8000,显示:hello world

对于局域网的其他用户,可通过你的主机 IP + 端口号访问,如你的主机 IP是192.168.0.1,通过网址 192.168.0.1:8000 可以看到 index.html 文件渲染的内容。

在本地浏览器访问远程服务器的端口映射

如果通过 VSCode 连接远程服务器,使用 http.server 开启一个端口后,会自动映射到本地,这样在本地浏览器就能查看和下载远程服务器资源。(除 VSCode 外,其他工具应该也可以实现远程与本地的端口映射)

注意

http.server 只实现了最基本的安全审查,请不要用于生产环境。

相关推荐
0566461 分钟前
Python康复训练——控制流与函数
开发语言·python·学习
NiceCloud喜云24 分钟前
海外云服务器怎么选?适用场景、价格和避坑经验总结
运维·服务器
天使day28 分钟前
FastAPI快速入门
python·fastapi
databook33 分钟前
用相关性分析消除“冗余特征”
python·机器学习·scikit-learn
幻想时空1 小时前
地图数据采集
python
梦想不只是梦与想1 小时前
Python 中的类型判断方法
python·type·isinstance
alphaTao2 小时前
LeetCode 每日一题 2026/7/27-2026/8/2
python·算法·leetcode
Kevin Wang7272 小时前
Nvidia-AGX-spark部署手册——课堂质量诊断(jetpack:r36)
python·docker·容器
kaoa0003 小时前
Linux入门攻坚——84、网络虚拟化技术-1
linux·运维·服务器
RisunJan3 小时前
Linux命令-shutdown(安全关闭或重启系统)
linux·服务器·安全