Python的HTTP库及示例
HTTP (Hyper Text Transfer Protocol )是一个客户端和服务器端请求和应答的标准。客户端是终端用户,服务器端是网站。客户端发起一个到服务器上指定端口的HTTP 请求,服务器向客户端发回一个状态行和响应的消息。
可以使用下面的模块创建Internet Server :
(1 )socketserver :以socket 为基础,创建一般性的IP Server 。
(2 )http :通过http 模块中的子模块server 和client 提供各种网络服务。
socketserver模块
socketserver 模块提供了一个架构来简化网络(包括服务器)的编写工作,用户不需要使用低级的socket 模块。
socketserver 模块包含的基本类如下:
(1 )TCPServer((hostname, port), handler) :支持TCP 的服务器。其中,hostname 是主机名称,通常是空白字符串;port 是通信端口号码;handler 是BaseRequestHandler 类的实例变量。
(2 )UDPServer((hostname, port), handler) :支持UDP 的服务器。其中,hostname 是主机名称,通常是空白字符串;port 是通信端口号码;handler 是BaseRequestHandler 类的实例变量。
(3 )UnixStreamServer((hostname, port), handler) :使用UNIX 网域socket 支持串流导向协议(stream-oriented protocol )的服务器。其中,hostname 是主机名称,通常是空白字符串;port 是通信端口号码;handler 是BaseRequestHandler 类的实例变量。
(4 )UnixDatagramServer((hostname, port), handler) :使用UNIX 网域socket 支持数据通信协议(datagram-oriented protocol )的服务器。其中,hostname 是主机名称,通常是空白字符串;port 是通信端口号码;handler 是BaseRequestHandler 类的实例变量。
下面是socketserver 模块中类的类变量:
(1 )request_queue_size :存储要求队列的大小,该队列用于传给socket 的listen() 方法。
(2 )socket_type :返回服务器使用的socket 类型,可以是socket.SOCK_STREAM 或socket.SOCK_DGRAM 。
下面是socketserver 模块中类的属性与方法:
(1 )address_family :可以是socket.AF_INET 或socket.AF_UNIX 。服务器的通信协议群组。
(2 )fileno() :返回服务器socket 的整数文件描述元(integer file descriptor )。
(3 )handle_request() :创建一个处理函数类的实例变量,以及调用handle() 方法处理单一请求。
(4 )RequestHandlerClass :存储用户提供的请求处理函数类。
(5 )server_address :返回服务器监听用的IP 地址与通信端口号码。
(6 )serve_forever() :操作一个循环来处理无限的请求。
下面的示例演示StreamRequestHandler 类的使用。
server模块
http 模块的子模块server 提供了各种HTTP 服务,主要包括BaseHTTPServer 、CGIHTTPServer 类及SimpleHTTPServer 类。
server 模块以socketserver 模块为基础,并且很少直接使用。server 模块定义了两个基类来操作基本的HTTP 服务器(网站服务器)。
server 模块的第一个基类是HTTPServer 类,其语法如下:
class HTTPServer((hostname, port), RequestHandlerClass)
HTTPServer 类由socketserver.TCPServer 类派生。此类先创建一个HTTPServer 对象并监听(hostname, port) ,然后使用RequestHandlerClass 来处理要求。
server 模块的第二个基类是BaseHTTPRequestHandler 类,其语法如下:
class BaseHTTPRequestHandler(request, client_address, server)
用户必须创建一个BaseHTTPRequestHandler 类的子类来处理HTTP 请求。如果要处理GET 请求,就必须重新定义do_GET() 方法;如果要处理POST 请求,就必须重新定义do_POST() 方法。
下面是BaseHTTPRequestHandler 类的类变量:
(1 )BaseHTTPRequestHandler.server_version 。
(2 )BaseHTTPRequestHandler.sys_version 。
(3 )BaseHTTPRequestHandler.protocol_version 。
(4 )BaseHTTPRequestHandler.error_message_format 。
每一个BaseHTTPRequestHandler 类的实例变量都有以下属性:
(1 )client_address :返回一个2 -tuple(hostname, port) ,为客户端的地址。
(2 )command :识别请求的种类,可以是GET 、POST 等。
(3 )headers :返回一个HTTP 表头。
(4 )path :返回请求的路径。
(5 )request_version :返回请求的HTTP 版本字符串。
(6 )rfile :包含输入流。
(7 )wfile :包含输出流。
每一个BaseHTTPRequestHandler 类的实例变量都有以下方法:
(1 )handle() :请求分派器。此方法会调用以 “do_ ” 开头的方法,如do_GET() 、do_POST() 等。
(2 )send_error(error_code [, error_message]) :将错误信号传输给客户端。
(3 )send_response(response_code [, response_message]) :传输响应表头。
(4 ) send_header(keyword, value) :写入一个 MIME 表头到输出流,此表头包含表头的键值及其值。
(5 )end_header() :用来识别MIME 表头的结尾。
下面的示例演示BaseHTTPRequestHandler 类的使用方法。
SimpleHTTPServer 类可以处理HTTP server 的请求,也可以处理所在目录的文件,即HTML 文件。SimpleHTTPRequestHeader 类的语法格式如下:
class SimpleHTTPRequestHandler(request, (hostname, port), server)
SimpleHTTPRequestHeader 类有以下两个属性:
(1 )SimpleHTTPRequestHeader.server_version 。定义服务器模块的级别
(2 ) SimpleHTTPRequestHeader.extensions_map :一个字典集,用于映射文件扩展名与 MIME 类型。
下面的示例演示SimpleHTTPRequestHandler 类的使用方法。
CGIHTTPRequestHeader 类除了可以处理所在目录的HTML 文件外,还可以运行客户端执行CGI (Common Gateway Interface )脚本。CGIHTTPRequestHeader 类的语法格式如下:
class CGIHTTPRequestHandler(request, (hostname, port), server)
CGIHTTPRequestHeader 类的属性cgi_directories 包含一个可以存储CGI 脚本的文件夹列表。
下面的示例演示CGIHTTPRequestHandler 类的使用方法。
client模块
client 模块主要处理客户端的请求。client 模块的HTTPConnection 类创建并返回一个connection 对象。HTTPConnection 类的语法格式如下:
class HTTPConnection ([hostname [, port]])
如果参数port 没有设置,默认值是80 。如果所有的参数都没有设置,就必须使用connect() 方法自行连接。以下3 个HTTPConnection 类的实例变量都会连接到相同的服务器:
HTTPConnection 类的实例变量的方法如下:
(1 )endheaders() :写入一行空白给服务器,表示这是客户端请求表头的结尾。
(2 )connect([hostname [, port]]) :创建一个连接。
(3 )getresponse() :返回服务器的状态。
(4 )request() :向服务器发送请求。
(5 )putheader(header, argument1 [, ...]) :写入客户端请求表头的表头行。每一行包括header 、一个冒号(: )、一个空白及argument 。
(6 )putrequest(request, selector) :写入客户端请求表头的第一行。参数 request 可以是 GET 、POST 、PUT 或HEAD ,参数selector 是要打开的文件名称。
(7 )send(data) :调用endheaders() 方法后,传输数据给服务器。
下面的示例返回 文件,并将此文件保存为一个新文件。
【例13.3 】使用HTTPConnection 类(源代码\ch13\13.3.py )。
保存并运行程序,即可将 文件的内容保存在 13.1.html 文件中。
本文节选自《 Python 编程从零开始学(视频教学版) 》,本次内容发布,获得作者和出版社授权。
扫一扫,关注我们