• 《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

  • 相关阅读:
    【PAT甲级】1014 Waiting in Line (30 分)(队列维护)
    【PAT甲级】1013 Battle Over Cities (25 分)(并查集,简单联通图)
    获取当前时间
    设备版本,设备号,APP版本,APP名称获取
    获取设备号
    Button的图像位置设置
    UIButton设置imgae图片自适应button的大小且不变形
    手势图片:拖拽捏合旋转放大
    Unable to add App ID because the '10' App ID limit in '7' days has been exceeded.
    iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
  • 原文地址:https://www.cnblogs.com/miaoxiaonao/p/8638262.html
Copyright © 2020-2023  润新知