《The Python Standard Library》——http模块阅读笔记2

http.server是用来构建HTTP服务器(web服务器)的模块,定义了许多相关的类。

创建及运行服务器的代码一般为:

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

类HTTPServer,是TCPServer的子类,是一个socketserver。它可以创建和监听HTTP socket,向handler分发requests。

class http.server.HTTPServer(server_addressRequestHandlerClass)

该类基于TCPServer类,通过将服务器地址存储在实例变量中(server_name和server_port)。服务器可以通过handler连接,主要是通过handler的server实例变量。

由于HTTPServer实例化时必须接收一个RequestHandlerClass,该模块提供了三种不同的变体:

1. class http.server.BaseHTTPRequestHandler(requestclient_addressserver)

说明:此类是用于处理服务器端接收的HTTP请求。但是,它自己本身并不能对任何HTTP requests进行响应。必须将其子类化(创建一个继承它的新的类)来处理每个请求方法(GET、POST等)。

   BaseHTTPRequestHandler类提供了许多类和实例变量以及用于子类的方法。

   handler会解析requests和headers,然后根绝request的类型调用相应的方法。方法名是由request构建。例如:对于request方法/类型 SPAM,就会调用不传入参数的do_SPAM()方法。所有相关

   信息都存储在handler的实例变量中。子类不需要被推翻(override)或者_init_()方法被重写。

BaseHTTPRequestHandler有以下实例变量:

client_address  :包含客户端IP和端口号的元组 

server      :包含服务器实例

close_connection :布尔值,在 handle_one_request() 返回之前设定,为真就等待另一个连接,为假就关闭连接

requestline    :包含HTTP请求行request line的字符串表示。行末的换行符(CRLF)会被去掉。

command     :包含请求类型,如'GET'.

path         :包含请求路径。

request_version  :包含请求的版本号的字符串表示,如'HTTP/1.0'

headers      :拥有一个由MessageClass类指定的实例,该实例解析和管理HTTP请求头部。http.client中的parse_headers()函数用于解析头部文件。

rfile        :包含一个输入流,位于选择输入的数据的开端。

wfile         :包含一个输出流,用于向客户端发送response。

BaseHTTPRequestHandler有下列属性:

server_version:服务器版本

sys_version:python版本

error_message_format:指定一个格式字符串,用于 send_error() 方法向客户端发送错误响应时的格式。

error_content_type:错误响应的HTTP头部中的Content-Type,默认是'text/html'.

protocol_version:指定响应中用的HTTP协议版本号,若为HTTP1.1,就允许持久连接(persitent connection),此时服务器必须在其对客户端的所有响应中包含一个准确的Content-Length头部。为了向后兼容,默认为HTTP1.0

MessageClass:指定一个解析HTTP headers的eamil.message.Message的类。

responses:该属性包含一个映射(字典),如:{code: (shortmessage, longmessage)}。code为状态码(整数),短消息一般为error response中的关键消息,长消息为其的解释。

BaseHTTPRequestHandler实例有下列方法:

handle():处理进来的HTTP requests.不能重写此方法。

handle_one_request():解析并分发requests至相应的do_*()方法.。不能重写此方法。

handle_expect_100():HTTP1.1.中处理 Expect:100-continue请求。

send_error(codemessage=Noneexplain=None):发送并记录一个完整的错误响应给客户端。code为错误对应的HTTP状态码,message为可选的对错误的简短的描述,explain可以提供更多的细节信息。

send_response(codemessage=None):添加一个响应头至头部缓存中并记录接收的请求。当服务器不打算使用send_header() 方法发送任何其他的头部时

   send_response()后面应该紧接着显式调用 end_headers()(空行)。

 

 

send_header(keywordvalue):将HTTP头部添加至内部缓存中,当调用end_headers()或flush_headers()时就会被写入输出流中。

send_response_only(codemessage=None):当服务端的响应是100 Continue时使用该方法。 

 

end_headers():在头部缓冲中添加一个空行(标志着头部的结束)并调用 flush_headers()

flush_headers():将头部缓存发送至输出流中,并flush内部headers的缓存。

log_request(code='-'size='-'):请求成功时进行记录。

log_message(format...):记录一个任意的消息至sys.stderr.

log_error(...):请求无法完成时记录错误。

version_string():返回服务器软件版本的字符串表示。是 属性server_version 和 sys_version 二者的结合。

date_time_string(timestamp=None):返回时间戳。如:'Sun, 06 Nov 1994 08:49:37 GMT'.

log_date_time_string():返回当前日期和时间。

address_string():返回客户端地址。

2. class http.server.SimpleHTTPRequestHandler(requestclient_addressserver)

说明:此类用于当前路径及其子路径中的文件,直接将目录结构映射至HTTP request中。

   许多工作(如解析请求)已经由基类BaseHTTPRequestHandler完成。此类添加了do_GET()和do_HEAD()函数。

The SimpleHTTPRequestHandler class can be used in the following manner in order to create a very basic webserver serving files relative to the current directory:

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

httpd = socketserver.TCPServer(("", PORT), Handler)

print("serving at port", PORT)
httpd.serve_forever()

http.server可以通过-m开关(命令行中)和端口号直接进行调用。跟上面的例子近似, this serves files relative to the current directory:

python -m http.server 8000

默认情况下,服务器将自己绑定在所有接口上。-b/-bind选项指定一个特定的IP与服务器绑定。例如:下面的命令行将服务器绑定到localhost:

python -m http.server 8000 --bind 127.0.0.1

1.3 class http.server.CGIHTTPRequestHandler(requestclient_addressserver)

说明:此类用于当前路径下(包含子路径)的文件或者CGI脚本的输出。将HTTP层次结构映射到当前目录结构的操作与SimpleHTTPRequestHandler一样。

   需要注意的是:CGIHTTPRequestHandler类运行的CGI脚本不能进行重定向(HTTP code:302),因为code 200(脚本输出)的发送会优先于CGI脚本的执行。

The do_GET() and do_HEAD() functions are modified to run CGI scripts and serve the output, instead of serving files, if the request leads to somewhere below the cgi_directories path。

该类定义了一个数据成员:cgi_directories 

也定义了一个方法:do_POST()   This method serves the 'POST' request type, only allowed for CGI scripts. Error 501, “Can only POST to CGI scripts”, is output when trying to POST to a non-CGI url.

CGIHTTPRequestHandler can be enabled in the command line by passing the --cgi option:

python -m http.server --cgi 8000

posted on 2018-03-24 15:59  leodowhat  阅读(424)  评论(0编辑  收藏  举报

导航