【Python实战】轻松搭建简易HTTP服务器使用http.server模块

目录

  • 官方文档
  • 安装
  • 教程
  • 用命令行创建
  • 编写代码创建
  • 实例
  • 官方文档

    http.server

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

    安装

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

    教程

    用命令行创建

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

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

    python -m http.server
    

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

    python -m http.server 9000
    

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

    python -m http.server --bind 127.0.0.1
    

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

    python -m http.server --directory /tmp/
    

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

    python -m http.server --cgi
    

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

    编写代码创建

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

    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 项目在局域网内的预览
  • 项目目录
  • web:.
    ├─index.html
    
  • index.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,显示:
  • Hello World
    

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

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

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

    作者:云淡丶风轻

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python实战】轻松搭建简易HTTP服务器使用http.server模块

    发表回复