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 只实现了最基本的安全审查,请不要用于生产环境。

相关推荐
YsyaaabB13 分钟前
Python 数值分析
python
阿洛学长21 分钟前
计算机二级 Python 基本操作题(15 分)真题笔记(0101 ~ 1903 全套)
python·pycharm
weixin199701080161 小时前
[特殊字符]️《二手ERP对接电商平台的总体方案:统一数据模型 + 事件驱动 + 灰度上线6原则》(附Python源码)
大数据·python
滚雪球~1 小时前
量化交易 防止Windows电脑自动更新并重启
python·量化
智恒百亿2 小时前
RTX 5090 八卡服务器 vs RTX PRO 6000 整机:AI 推理、微调与渲染选型部署指南
运维·服务器·rtx5090
ManageEngineITSM2 小时前
DevOps和ITIL是什么关系?是替代还是互补一文讲清
java·服务器·资产管理·变更管理
L@ncor2 小时前
第二章可能出现的问题
人工智能·python
y = xⁿ3 小时前
大模型基础概念
python
ctlover3 小时前
排序与查找算法详解
开发语言·python
用户8356290780513 小时前
如何使用 Python 给 Word 文档添加水印
后端·python