Python的HTTP库及示例

发布时间:2025-05-21 18:49:52 作者:益华网络 来源:undefined 浏览量(2) 点赞(3)
摘要:HTTP (Hyper Text Transfer Protocol )是一个客户端和服务器端请求和应答的标准。客户端是终端用户,服务器端是网站。客户端发起一个到服务器上指定端口的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 类的使用。

1
2
3
4
5
6
7
8
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()

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 类的使用方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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()

SimpleHTTPServer 类可以处理HTTP server 的请求,也可以处理所在目录的文件,即HTML 文件。SimpleHTTPRequestHeader 类的语法格式如下:

class SimpleHTTPRequestHandler(request, (hostname, port), server)

SimpleHTTPRequestHeader 类有以下两个属性:

1 SimpleHTTPRequestHeader.server_version 。定义服务器模块的级别

2 SimpleHTTPRequestHeader.extensions_map :一个字典集,用于映射文件扩展名与 MIME 类型。

下面的示例演示SimpleHTTPRequestHandler 类的使用方法。

1
2
3
4
import http.server
myHandler = http.server.SimpleHTTPRequestHandler
myServer = http.server.HTTPServer(("", 80), myHandler)
myServer.serve_forever()

CGIHTTPRequestHeader 类除了可以处理所在目录的HTML 文件外,还可以运行客户端执行CGI Common Gateway Interface )脚本。CGIHTTPRequestHeader 类的语法格式如下:

class CGIHTTPRequestHandler(request, (hostname, port), server)

CGIHTTPRequestHeader 类的属性cgi_directories 包含一个可以存储CGI 脚本的文件夹列表。

下面的示例演示CGIHTTPRequestHandler 类的使用方法。

1
2
3
4
5
6
import cgihttpserver
import BaseHTTPServer
class myHandler(http.server.CGIHTTPRequestHandler):
cgi_directories = ["/cgi-bin"]
myServer = http.server.HTTPServer(("", 80), myHandler)
myServer.serve_forever()

client模块

client 模块主要处理客户端的请求。client 模块的HTTPConnection 类创建并返回一个connection 对象。HTTPConnection 类的语法格式如下:

class HTTPConnection ([hostname [, port]])

如果参数port 没有设置,默认值是80 。如果所有的参数都没有设置,就必须使用connect() 方法自行连接。以下3 HTTPConnection 类的实例变量都会连接到相同的服务器:

1
2
3
4
import http.client
h1 = http.client.HTTPConnection (")
h2 = http.client.HTTPConnection (")
h3 = http.client.HTTPConnection (", 80)

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 )。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import http.client
#指定主机名称
url = "
#指定打开的文件名称
urlfile = "/News.html"
#连接到主机
host = http.client.HTTPConnection (url)
#写入客户端要求表头的第一行
host.request("GET", urlfile)
#获取服务器的响应
r1=host.getresponse()
#打印服务器返回的状态
print(r1.status,r1.reason)
#将file对象的内容存入新文件
file = open("13.1.html", "w")
#读取网页内容,以utf-8方式保存
str = r1.read().decode("utf-8")
#寻找文本
print(str.find("mlive"))
#写到文件并将xa0替换为空字符
file.write(str.replace(\xa0,))
#关闭文件
file.close()

保存并运行程序,即可将 文件的内容保存在 13.1.html 文件中。

本文节选自《 Python 编程从零开始学(视频教学版) 》,本次内容发布,获得作者和出版社授权。

 

二维码

扫一扫,关注我们

声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

感兴趣吗?

欢迎联系我们,我们愿意为您解答任何有关网站疑难问题!

您身边的【网站建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,响应式网站,SEO优化,小程序开发,公众号系统,软件开发等

立即咨询 15368564009
在线客服
嘿,我来帮您!