【Python】快速创建一个简易 HTTP 服务器(http.server)

目录

官方文档

http.server

警告: http.server 不推荐用于生产环境。它仅仅实现了 basic security checks 的要求。

安装

Python3 内置标准模块,无需安装。(在之前的 Python2 版本名称是 SimpleHTTPServer)

教程

用命令行创建

http.server 支持以 Python 解释器的 -m 参数直接调用。

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

powershell 复制代码
python -m http.server

服务器默认监听端口是 8000,支持自定义端口号:

powershell 复制代码
python -m http.server 9000

服务器默认绑定到所有接口,可以通过 -b/--bind 指定地址,如本地主机:

powershell 复制代码
python -m http.server --bind 127.0.0.1

服务器默认工作目录为当前目录,可通过 -d/--directory 参数指定工作目录:

powershell 复制代码
python -m http.server --directory /tmp/

通过在命令行传入 --cgi 参数,可以启用 CGIHTTPRequestHandler :

powershell 复制代码
python -m http.server --cgi

警告: CGIHTTPRequestHandler 和 --cgi 命令行选项不可供不受信任的客户端使用且容易受到恶意利用。 应当始终在安全的环境中使用。

编写代码创建

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

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


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,
        bind='127.0.0.1',
        port=8000,
        cgi=False,
        directory=os.getcwd()):

    if cgi:
        handler_class = CGIHTTPRequestHandler
    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()
  • server_class:服务器类
  • handler_class:请求处理类
  • bind:IP
  • port:端口
  • cgi:是否启用 CGI 请求处理程序
  • directory:工作目录

实例

既然我们已经知道了 http.server 能够快速地创建一个 HTTP 服务器,那么它能应用到哪些项目场景?

  1. 小型 web 项目在局域网内的预览
  • 项目目录
powershell 复制代码
web:.
├─index.html
  • index.html
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
Hello World
</body>
</html>
  • 切换到目录 cd web,执行命令 python -m http.server,浏览器地址栏输入 localhost:8000,显示:
powershell 复制代码
Hello World

对于局域网的其他用户,可通过你的主机 IP + 端口号访问,如你的主机 IP 是 192.168.0.1,那么将网址 192.168.0.1:8000 发送给你的同事或同学,他们也可以看到 index.html 文件渲染的内容。

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

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

相关推荐
信誓旦旦的程序猿7 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫7 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
KeepRobots9 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python
xiao77mwq9 小时前
你以为 OCR 慢?实测 81.3 s 里全是故障代价:如何把「定格态」消掉,让耗时从 6.5 s 到 13 倍差距显出原形
python
深圳市益普科技有限公司9 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
“AI国潮设计-小江”9 小时前
【AIGC实战】Python+SDXL打造“潮汕英歌舞IP”万能立牌插件,批量生成“发财元宝蛋糕”视觉营销方案(附源码)
开发语言·人工智能·python·prompt·aigc
砚底藏山河10 小时前
python量化实操:冷热分层存储
java·开发语言·python·金融
十五年专注C++开发10 小时前
pybind11:一个跨C++和Python平台的编程库
开发语言·c++·python·pybind11
炘爚10 小时前
数据结构算法总结
数据结构·python·算法
信誓旦旦的程序猿11 小时前
【Python量化实战宝典 #18】MACD 金叉死叉手册:DIF、DEA、柱体全拆解(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口