Python内置的http server

June 7, 2018, 1:10 a.m.

In Python 3.6.7

  • python 2 中的SimpleHTTPServer模块,在python 3 中已经合并到了http.server里(The SimpleHTTPServer module has been merged into http.server in Python 3.) 来源
  • python -m http.server python -m http.server 1234 python -m http.server 1234 --bind 127.0.0.1 选项--bind可用-b替换,新增于Python 3.4
  • 访问的权限控制还可通过绑定到指定地址来实现 如果仅需要本机访问,则绑定到127.0.0.1 如果需要开放给局域网内的用户访问,则绑定到主机的局域网地址
  • 查看http.server — HTTP servers使用说明
  • 如何共享多个目录?
  • 通过使用不同的端口来实现:
    • 在终端中,先使用 cd your_dir 命令,将当前目录切换到你要共享的目录A
    • 然后运行 python -m http.server 2098
    • 新开一个终端窗口,将当前目录切换到你要共享的目录B
    • 接着运行 python -m http.server 2099
    • 注意两次启动http server的命令的端口号是不一样的,也就是说通过使用不同的端口号就实现了共享不同的目录
  • 如果需要TLS认证呢?要如何实现?
import http.server
import ssl
import json

class SimpleHandler(http.server.BaseHTTPRequestHandler):

    def do_POST(self):  # 处理POST请求

        # 接收POST数据
        # self.rfile.read 读取的是原始的数据流 类型为字节 只能读取一次 第二次读取值为空
        request = json.loads(self.rfile.read(int(self.headers['Content-Length'])).decode())

        # 响应请求
        self.send_response(code)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        self.wfile.write(json.dumps({'msg': 'ok'}).encode  # 需要编码为字节类型的数据


if __name__ == '__main__':

    httpd = http.server.HTTPServer(('0.0.0.0', 4488), SimpleHandler)
    httpd.socket = ssl.wrap_socket(  # 使用标准库中ssl的wrap_socket来包住http, 就是https了
        httpd.socket,
        keyfile='tls/tls.key',  # 指定文件
        certfile='tls/tls.crt',  # 指定文件
        server_side=True,
    )
    httpd.serve_forever()

快速开始 ( Python 2.7.10 )

In iMac

1.打开终端

2.输入pwd 按下return

3.终端显示一个路径,这是你即将要共享的目录

4.输入 python -m SimpleHTTPServer 按下return

5.终端显示 Serving HTTP on 0.0.0.0 port 8000 ...

6.不出意外,你已经成功启动了Python内置的Web服务器

In Another Device(如:个人计算机/平板电脑/智能手机)

7.确认与iMac是否在同一局域网内

8.打开浏览器

9.输入iMac的局域网地址:8000 按下回车(如:192.168.249.85:8000)

10.显示出共享目录中的文件和子目录

11.浏览/下载文件

深入了解

1. Index.html

  • 如果共享的目录下存在Index.html文件(大小写不敏感),则该文件会被渲染为Web主页
  • 如果该文件不存在,才会显示整个目录的内容

2. python -m

  • 调用的是一个脚本时 python myscript.py
  • 调用的是一个语句时 python -c 选项-c会将python语句作为一个命令来执行(it executes the Python statement(s) given as command.) 如:python -c "import django"可用于检测django是否安装
  • 调用的是一个模块时 python -m The SimpleHTTPServer module can also be invoked directly using the -m switch of the interpreter with a port number argument. 来源 由以上官方文档的说明得知SimpleHTTPServer是一个模块,且明确指出python解释器需要选项-m来进行直接调用

  • 查看The Python Interpreter Interface Options使用说明

3. 指定端口

python -m SimpleHTTPServer 1234  # 端口为1234
python -m SimpleHTTPServer  # 端口为8000(默认值)

4. 指定目录

  • a. 使用Linux的cd命令进入到期望的目录中
  • b. 输入 python -m SimpleHTTPServer按下return

常用场景

  • 快速共享文件给小伙伴们浏览或下载,而无需等待微信/QQ等工具的上传/下载带来的注意力损耗

新新手专区

  • 1点:<终端>是一个应用程序,可以称为终端应用程序 先打开Finder,然后在<应用程序>文件夹里找到它

  • 2点:<pwd>是一个Linux命令,Print Working Directory(打印正在工作的目录),绝对路径,这里的打印可以理解为打印到终端

  • 9点:192.168.249.85:8000该地址由两部分组成,以英文冒号作为分隔符,即主机局域网地址:端口号 此处的主机指的是启动Web服务器的iMac macOS系统下的主机局域网地址获取方式为:系统偏好设置->网络->“Wi-Fi”已连接至“Personal Wi-Fi Name”,其 IP 地址为 192.168.249.85

运行环境

  • Python:2.7.10
  • 个人计算机:iMac
  • 操作系统:macOS
  • 处理器:2.9GHz 四核 Intel Core i5
  • 内存:8GB 1600MHz DDR3

SimpleHTTPServer与http.server的不同之处

  • SimpleHTTPServer是Python 2 中的实现
  • http.server是Python 3 中的实现
  • http.server新增了Web服务器绑定到指定地址的功能,默认绑定到Web服务器所在的主机(By default, server binds itself to all interfaces. The option -b/--bind specifies a specific address to which it should bind.) 来源

返回首页