Python的HTTP库及示例

news/2024/11/29 7:41:27/

13.3  HTTP库

HTTP(Hyper Text Transfer Protocol)是一个客户端和服务器端请求和应答的标准。客户端是终端用户,服务器端是网站。客户端发起一个到服务器上指定端口的HTTP请求,服务器向客户端发回一个状态行和响应的消息。

可以使用下面的模块创建Internet Server:

(1)socketserver:以socket为基础,创建一般性的IP Server。

(2)http:通过http模块中的子模块server和client提供各种网络服务。

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

import socketserverport = 50007class myRequestHandler(socketserver.StreamRequestHandler):def handle(self):print ("Connection by ", self.client_address)self.wfile.write("data")s = socketserver.TCPServer(("", port), myRequestHandler)s.serve_forever()

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

import http.serverhtmlpage = """<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类的使用方法。

import http.servermyHandler = http.server.SimpleHTTPRequestHandlermyServer = 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类的使用方法。import cgihttpserverimport BaseHTTPServerclass myHandler(http.server.CGIHTTPRequestHandler):cgi_directories = ["/cgi-bin"]myServer = http.server.HTTPServer(("", 80), myHandler)myServer.serve_forever()

13.3.3  client模块

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

class HTTPConnection ([hostname [, port]])

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

import http.clienth1 = http.client.HTTPConnection ("www.cwi.nl")h2 = http.client.HTTPConnection ("www.cwi.nl:80")h3 = http.client.HTTPConnection ("www.cwi.nl", 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()方法后,传输数据给服务器。

下面的示例返回http://www.python.org/News.html文件,并将此文件保存为一个新文件。

【例13.3】使用HTTPConnection类(源代码\ch13\13.3.py)。

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("13.1.html", "w")
#读取网页内容,以utf-8方式保存
str = r1.read().decode("utf-8")
#寻找文本
print(str.find("mlive"))
#写到文件并将'xa0'替换为空字符
file.write(str.replace('\xa0',''))
#关闭文件
file.close()

保存并运行程序,即可将http://www.python.org/News.html文件的内容保存在13.1.html文件中。

-------------------------------------------

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

 


http://www.ppmy.cn/news/62954.html

相关文章

华为OD机试 - 第一个错误的版本(Java)

一、题目描述 你是产品经理&#xff0c;目前正在带领一个团队开发新的产品。不幸的是&#xff0c;你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的&#xff0c;所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, …, n]&#xff…

如何学好单片机C语言并写出高质量代码

单片机C语言的学习需要掌握以下方面&#xff1a; C语言基础&#xff1a;需要学习C语言的基本语法、数据类型、运算符、控制语句等基础知识。 单片机基础&#xff1a;需要掌握单片机的基本结构、寄存器、输入输出等知识。 编程思想&#xff1a;需要掌握编程思想&#xff0c;如…

测试5年从中兴 15K 跳槽去腾讯 32K+16,啃完这份笔记你也可以

粉丝小王转行做测试已经是第5个年头&#xff0c;一直是一个不温不火的小职员&#xff0c;本本分分做着自己的事情&#xff0c;觉得自己的工作已经遇到了瓶颈&#xff0c;一个偶然的机会&#xff0c;获得了一份软件测试全栈知识点学习笔记&#xff0c;通过几个月的学习&#xff…

【递推专题】常见的递推“模型”总结

目录 1.斐波那契数列分析&#xff1a;代码&#xff1a; 2.平面分割问题分析&#xff1a; 3.汉诺塔问题分析&#xff1a; 4.卡特兰数分析&#xff1a; 5.第二类斯特林数总结&#xff1a; 1.斐波那契数列 分析&#xff1a; 斐波那契数列又称兔子数列&#xff0c;其原理来源于兔子…

记录--极致舒适的Vue页面保活方案

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 为了让页面保活更加稳定&#xff0c;你们是怎么做的&#xff1f; 我用一行配置实现了 Vue页面保活是指在用户离开当前页面后&#xff0c;可以在返回时恢复上一次浏览页面的状态。这种技术可以让用户享…

信息安全从业人员职业规划(甲方乙方分别说明)

职业类型 信息安全咨询师 信息安全测评师 信息安全服务人员 信息安全运维人员 信息安全方案架构师 安全产品开发工程师 安全策略工程师 培训讲师 漏洞挖据 攻防测试 信息安全管理岗(甲) 目标:以服务自己为主,在企业内部地位还可以 安全体系管理员 大型企业安全体系化建设,有时…

100天精通Python(可视化篇)——第82天:matplotlib绘制不同种类炫酷散点图参数说明+代码实战(二维散点图、三维散点图、散点图矩阵)

文章目录 专栏导读0. 前言1. 参数说明2. 两主特征:二维散点图1)普通散点图2)文字标签散点图3)带颜色映射的散点图4)ArcGIS散点图5)

第八章 使用Apache服务部署静态网站

文章目录 第八章 使用Apache服务部署静态网站一、网站服务程序1、网站服务介绍2、Apache程序介绍 二、配置服务文件参数1、Linux系统中的配置文件2、配置httpd服务程序时最常用的参数以及用途描述 三、SELinux安全子系统1、SELinux介绍2、SELinux服务配置模式3、Semanage命令4、…