创新互联Python教程:http.server—-HTTP服务器

http.server —- HTTP 服务器

源代码: Lib/http/server.py

创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的巴彦网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!


这个模块定义了用于实现 HTTP 服务器的类。

警告

http.server is not recommended for production. It only implements basic security checks.

Availability: not Emscripten, not WASI.

This module does not work or is not available on WebAssembly platforms wasm32-emscripten and wasm32-wasi. See WebAssembly platforms for more information.

HTTPServer 是 socketserver.TCPServer 的一个子类。它会创建和侦听 HTTP 套接字,并将请求分发给处理程序。创建和运行 HTTP 服务器的代码类似如下所示:

 
 
 
 
  1. def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
  2. server_address = ('', 8000)
  3. httpd = server_class(server_address, handler_class)
  4. httpd.serve_forever()

class http.server.HTTPServer(server_address, RequestHandlerClass)

该类基于 TCPServer 类,并在实例变量 server_nameserver_port 中保存 HTTP 服务器地址。处理程序可通过实例变量 server 访问 HTTP 服务器。

class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)

该类相似于 HTTPServer ,只是会利用 ThreadingMixIn 对请求进行多线程处理。当需要对 Web 浏览器预先打开套接字进行处理时,这就很有用,这时 HTTPServer 会一直等待请求。

3.7 新版功能.

实例化 HTTPServer 和 ThreadingHTTPServer 时,必须给出一个 RequestHandlerClass,本模块提供了该对象的三种变体:

class http.server.BaseHTTPRequestHandler(request, client_address, server)

这个类用于处理到达服务器的 HTTP 请求。 它本身无法响应任何实际的 HTTP 请求;它必须被子类化以处理每个请求方法(例如 GET 或 POST)。 BaseHTTPRequestHandler 提供了许多供子类使用的类和实例变量以及方法。

这个处理程序将解析请求和标头,然后调用特定请求类型对应的方法。 方法名称将根据请求来构造。 例如,对于请求方法 SPAM,将不带参数地调用 do_SPAM() 方法。 所有相关信息会被保存在该处理程序的实际变量中。 子类不需要重载或扩展 __init__() 方法。

BaseHTTPRequestHandler 具有下列实例变量:

BaseHTTPRequestHandler 具有下列属性:

BaseHTTPRequestHandler 实例具有下列方法:

class http.server.SimpleHTTPRequestHandler(request, client_address, server, directory=None)

这个类会为目录 directory 及以下的文件提供发布服务,或者如果未提供 directory 则为当前目录,直接将目录结构映射到 HTTP 请求。

3.7 新版功能: directory 形参。

在 3.9 版更改: directory 形参接受一个 path-like object。

诸如解析请求之类的大量工作都是由基类 BaseHTTPRequestHandler 完成的。本类实现了 do_GET() 和 do_HEAD() 函数。

以下是 SimpleHTTPRequestHandler 的类属性。

SimpleHTTPRequestHandler 类定义了以下方法:

SimpleHTTPRequestHandler 类的用法可如下所示,以便创建一个非常简单的 Web 服务,为相对于当前目录的文件提供服务:

 
 
 
 
  1. import http.server
  2. import socketserver
  3. PORT = 8000
  4. Handler = http.server.SimpleHTTPRequestHandler
  5. with socketserver.TCPServer(("", PORT), Handler) as httpd:
  6. print("serving at port", PORT)
  7. httpd.serve_forever()

http.server 也可以使用解释器的 -m 参数直接调用。 与前面的例子类似,这将提供相对于当前目录的文件:

 
 
 
 
  1. python -m http.server

服务器默认监听端口为8000。可以通过传递所需的端口号作为参数来覆盖默认值:

 
 
 
 
  1. python -m http.server 9000

默认情况下,服务器将自己绑定到所有接口。 选项 -b/—bind 指定了一个特定的地址,它应该与之绑定。 IPv4 和 IPv6 地址都被支持。例如,下面的命令使服务器只绑定到 localhost:

 
 
 
 
  1. python -m http.server --bind 127.0.0.1

3.4 新版功能: 引入了 --bind 参数。

3.8 新版功能: 为了支持 IPv6 改进了 --bind 参数。

默认情况下,服务器使用当前目录。选项 -d/--directory 指定了一个它应该提供文件的目录。例如,下面的命令使用一个特定的目录:

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

3.7 新版功能: --directory 参数被引入。

By default, the server is conformant to HTTP/1.0. The option -p/--protocol specifies the HTTP version to which the server is conformant. For example, the following command runs an HTTP/1.1 conformant server:

 
 
 
 
  1. python -m http.server --protocol HTTP/1.1

3.11 新版功能: --protocol argument was introduced.

class http.server.CGIHTTPRequestHandler(request, client_address, server)

该类可为当前及以下目录中的文件或输出 CGI 脚本提供服务。注意,把 HTTP 分层结构映射到本地目录结构,这与 SimpleHTTPRequestHandler 完全一样。

备注

由 CGIHTTPRequestHandler 类运行的 CGI 脚本不能进行重定向操作(HTTP 代码302),因为在执行 CGI 脚本之前会发送代码 200(接下来就输出脚本)。这样状态码就冲突了。

然而,如果这个类猜测它是一个 CGI 脚本,那么就会运行该 CGI 脚本,而不是作为文件提供出去。 只会识别基于目录的 CGI —— 另有一种常用的服务器设置,即标识 CGI 脚本是通过特殊的扩展名。

如果请求指向 cgi_directories 以下的路径,do_GET()do_HEAD() 函数已作修改,不是给出文件,而是运行 CGI 脚本并输出结果。

CGIHTTPRequestHandler 定义了以下数据成员:

CGIHTTPRequestHandler 定义了以下方法:

请注意,为了保证安全性,CGI 脚本将以用户 nobody 的 UID 运行。CGI 脚本运行错误将被转换为错误 403。

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

 
 
 
 
  1. python -m http.server --cgi

安全考量

SimpleHTTPRequestHandler will follow symbolic links when handling requests, this makes it possible for files outside of the specified directory to be served.


当前文章:创新互联Python教程:http.server—-HTTP服务器
当前地址:http://www.turtgq.com/article/dpdepio.html

其他资讯