Python HTTP库网络编程详解
HTTP(Hyper Text Transfer Protocol)是一个客户端和服务器端请求和应答的标准。客户端是终端用户,服务器端是网站。客户端发起一个到服务器上指定端口的 HTTP 请求,服务器向客户端发回一个状行和响应的消息。
可以使用下面的模块创建 Internet Server:
本节主要介绍 Python 的 socketserver 模块。
为了通过线程来处理请求,可以使用 ThreadingTCPServer 、ThreadingUDPServer 类、ForkingTCPServer 类及 ForkingUDPServer 类。
StreamRequestHandler 与 DatagramRequestHandler 类提供了两个属性,即 self.rfile 与 self.wfile,可以用来在客户端应用程序中读/写数据。
下面是 SocketServe 模块提供的类:
下面是上述类的属性与方法:
下面的示例是演示 StreamRequestHandler 类的使用。
server 模块定义两个基类来操作基本的 HTTP 服务器(网站服务器)。此模块以 socketserver 模块为基础,并且很少直接使用。
下面的示例是演示BaseHTTPRequestHandler类的使用方法。
下面的示例是演示类 SimpleHTTPRequestHandler 的使用方法。
CGIHTTPRequestHeader 类的语法格式如下:
下面的示例演示了 CGIHTTPRequestHandler 类的使用方法。
HTTPConnection 类的实例变量的方法如下:
下面示例是返回“http://www.python.org/News.html”文件,并将此文件保存为一个新文件。
声明:《Python系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
可以使用下面的模块创建 Internet Server:
- socketserver:以 socket 为基础,一般性的 IP Server。
- http:通过 http 模块中的子模块 server 和 client 提供各种网络服务。
本节主要介绍 Python 的 socketserver 模块。
1. socketserver模块中的类
socketserver 模块提供了一个架构来简化网络包括服务器的编写工作,用户不需要使用低级的 socket 模块。socketserver 模块提供了基本的 server 类,即 TCPServer、UDPServer、StreamRequestHandler 及 DatagramRequestHandler,这些类处理同步的请求,每一个请求都必须在下一个请求开始前完成。但是如果客户端需要长时间的计算,这些类就不适合。为了通过线程来处理请求,可以使用 ThreadingTCPServer 、ThreadingUDPServer 类、ForkingTCPServer 类及 ForkingUDPServer 类。
StreamRequestHandler 与 DatagramRequestHandler 类提供了两个属性,即 self.rfile 与 self.wfile,可以用来在客户端应用程序中读/写数据。
下面是 SocketServe 模块提供的类:
1) TCPServer((hostname, port), handler)
支持 TCP 协议的服务器。其中,hostname 是主机名称,通常是空白字符串;port 是通信端口号码;handler 是 BaseRequestHandler 类的实例变量。2)UDPServer((hostname, port), handler)
支持 UDP 协议的服务器。其中,hostname 是主机名称,通常是空白字符串;port 是通信端口号码;handler 是 BaseRequestHandler 类的实例变量。3) UNTXStreamServer((hostname, port), handler)
使用 UNTX 网域 socket 支持串流导向协议(stream-oriented protocol)的服务器。其中,hostname 是主机名称,通常是空白字符串;port 是通信端口号码;handler是 BaseRequestHandler 类的实例变量。4) UNTXDatagramServer((hostname, port), handler)
使用 UNTX 网域 socket 支持数据通信协议(datagram-oriented protocol)的服务器其中,hostname 是主机名称,通常是空白字符串;port 是通信端口号码;handler 是 BaseRequestHandler 类的实例变量。2. socketserver类变量与类属性
下面是上述类的类变量:
- request_queue_size:存储要求队列的大小,该队列用于传给 socket 的 listen() 方法。
- socket_type:返回服务器使用的socket类型,可以是 socket.SOCK_STREAM 或 socket.SOCK_DGRAM。
下面是上述类的属性与方法:
1) address_family
可以是 socket.AF_INET 或 socket.AF_UNTX。服务器的通信协议群组。2) fileno()
返回服务器 socket 的整数文件描述元(integer file descriptor)。3) handle_request()
创建一个处理函数类的实例变量,以及调用 handle() 方法处理单一请求。4) RequestHandlerClass
存储用户提供的请求处理函数类。5) server_address
返回服务器监听用的 IP 地址与通信端口号码。6) serve_forever()
操作一个循环来处理无限的请求。下面的示例是演示 StreamRequestHandler 类的使用。
>>> import socketserver
>>>port = 50007
>>>class myRequestHandler (socketserver . StreamRequestHandler) :
def handle(self) :
print ("Connection by ",self.client_address)
self. wfile. write ("data")
>>>s = socketserver. TCPServer( ("",port),myRequestHandler)
>>>s. serve_forever ()
http 模块的子模块 server 提供了各种 HTTP 服务,主要包括 BaseHTTPServer类、CGIHTTPServer 类及 SimpleHTTPServer 类。server 模块定义两个基类来操作基本的 HTTP 服务器(网站服务器)。此模块以 socketserver 模块为基础,并且很少直接使用。
3. HTTPServer类
server 模块的第一个基类是 HTTPServer 类,其语法如下:class HTTPServer((hostname, port), RequestHandlerClass)
HTTPServer 类由 socketserver.TCPServer 类派生。此类先创建一个 HTTPServer 对象并监听(hostname, port),然后使用 RequestHandlerClass 来处理要求。4. BaseHTTPRequestHandler类
server 模块的第二个基类是 BaseHTTPRequestHandler 类,其语法如下:class BaseHTTPRequestHandler(request, client_address, server)
用户必须创建一个 BaseHTTPRequestHandler 类的子类来处理 HTTP 请求。如果要处理 GET 请求,就必须重新定义 do_GET() 方法;如果要处理 POST 请求,就必须重新定义 do_POST() 方法。1) 类变量
下面是 BaseHTTPRequestHandler 类的类变量:- BaseHTTPRequestHandler.server_version
- BaseHTTPRequestHandler.sys_version
- BaseHTTPRequestHandler.protocol_version
- BaseHTTPRequestHandler.error_message_format
2) 类属性
每一个 BaseHTTPRequestHandler 类的实例变量都有以下属性:- client_address:返回一个 2-tuple(hostname, port),为客户端的地址。
- command:识别请求的种类,可以是 GET、POST 等。
- headers:返回一个 HTTP 表头。
- path:返回请求的路径。
- request_version:返回请求的HTTP版本字符串。
- rfile:包含输入流。
- wfile:包含输出流。
3) 类方法
每一个 BaseHTTPRequestHandler 类的实例变量都有以下方法:- handle():请求分派器。此方法会调用以“do_”开头的方法,如do_GET()、do_POST()等。
- send_error(error_code [, error_message]):将错误信号传输给客户端。
- send_response(response_code [, response_message]):传输响应表头。
- send_header(keyword, value):写入一个MIME表头到输出流,此表头包含表头的键值及其值。
- end_header():用来识别MIME表头的结尾。
下面的示例是演示BaseHTTPRequestHandler类的使用方法。
>>>import http.server
>>>htmlpage = """
<html><head><title>Web Page</title></head>
<body>Hello Python</body></html>"""
>>>class myHandler (http. server . BaseHTTPRequestHandler) :
def do_GET(self) :
if self.path == "/":
self.send_response (200)
self.send_header ("Content-type", "text/html")
self.end_headers ()
self.wfile.write (htmlpage)
else :
self.send_error (404,"File not found")
>>>myServer = http. server.HTTPServer( ("", 80),myHandler)
>>>myServer.serve_forever ()
5. SimpleHTTPServer类
SimpleHTTPServer 类可以处理 HTTP server 的请求,也可以处理所在目录的文件,即 HTML 文件。SimpleHTTPRequestHeader 类的语法格式如下:class SimpleHTTPRequestHandler(request, (hostname, port), server)
SimpleHTTPRequestHeader类有以下两个属性:- SimpleHTTPRequestHeader.server_version
- SimpleHTTPRequestHeader.extensions_map:一个字典集,用于映像文件扩展名与MIME类型。
下面的示例是演示类 SimpleHTTPRequestHandler 的使用方法。
>>> import http. server
>>>myHandler = http. server.SimpleHTTPRequestHandler
>>>myServer = http. server.HTTPServer(("",80),myHandler)
>>>myServer.serve_forever ()
6. CGIHTTPRequestHeader类
CGIHTTPRequestHeader 类除了可以处理所在目录的 HTML 文件外,还可以运行客户端执行 CGI(Common Gateway Interface)脚本。CGIHTTPRequestHeader 类的语法格式如下:
class CGIHTTPRequestHandler(request, (hostname, port), server)
CGIHTTPRequestHeader 类的属性 cgi_directories,包含一个可以存储 CGI 脚本的文件夹列表。下面的示例演示了 CGIHTTPRequestHandler 类的使用方法。
>>>import cgihttpserver
>>>import BaseHTTPServer
>>>class myHandler (http. server . CGIHTTPRequestHandler) :
cgi_directories = ["/cgi-bin"]
>>>myServer = http. server . HTTPServer(("", 80),myHandler)
>>>myServer.serve_forever()
client 模块主要处理客户端的请求。client 模块的 HTTPConnection 类创建并返回一个 connection 对象。HTTPConnection 类的语法如下:class HTTPConnection ([hostname [, port]])
如果没有设置参数 port,默认值是 80。如果所有的参数都没有设置,就必须使用 connect() 方法自行连接。以下三个 HTTPConnection 类的实例变量,都会连接到相同的服务器:
>>>import http.client
>>>h1 =http.client.HTTPConnection ("www.cwi.nl")
>>>h2 =http.client.HTTPConnection ("www.cwi.nl:80")
>>>h3 =http.client.HTTPConnection ("www.cwi.nl",80)
HTTPConnection 类的实例变量的方法如下:
- endheaders():写入一行空白给服务器,表示这是客户端请求表头的结尾。
- connect([hostname [, port]]):创建一个连接。
- getresponse():返回服务器的状态。
- request():向服务器发送请求。
- putheader(header, argument1 [, ...]):写入客户端请求表头的表头行。每一行包括 header、一个冒号(:)、一个空白及 argument。
- putrequest(request, selector):写入客户端请求表头的第一行。参数 request 可以是 GET、POST、PUT 或 HEAD。参数 selector 是要打开的文件名称。
- send(data):调用 endheaders() 方法后,传输数据给服务器。
下面示例是返回“http://www.python.org/News.html”文件,并将此文件保存为一个新文件。
#使用HTTPConnection类
import http. client
#指定主机名称
url = "www.python.org"
#指定打开的文件名称
urlfile = "/News.html"
#连接到主机
host = http.client.HTTPConnection (url)
#写入客户端要求表头的第一-行
host.request ("GET", urlfile)
#获取服务器的响应
r1=host.getresponse ()
#打印服务器返回的状态
print (r1. status, r1. reason)
#将file对象的内容存入新文件
file = open("D: \\python\\ch16\\16.1.html","w")
#读取网页内容,以utf-8方式保存
str =r1.read().decode ("utf-8")
#寻找文本
print (str. find ("mlive") )
#找到文件并替换'xa0' 为空字符
#replace("caoxuesong",'')
file.write (str. replace('\xa0',''))
#关闭文件
file.close ()
保存并运行程序,即可将“http://www.python.org/News.html”文件的内容保存在 16.1.html 文件中。声明:《Python系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。