百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

干货分享丨Python的HTTP库及示例

liuian 2025-02-11 12:40 41 浏览

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

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.server 
htmlpage = """
Web Page
Hello Python"""
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.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类的使用方法。

import cgihttpserver
import BaseHTTPServer
class 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.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类的实例变量的方法如下:

(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编程从零开始学(视频教学版)》,本次内容发布,获得作者和出版社授权。

相关推荐

windows server 2003的应用(win2003应用程序服务器)

WindowsServer2003支持FAT16、FAT32和NTFS文件系统,同时也支持CDFS(光盘文件系统)和UDF(通用磁盘格式)。NTFS文件系统的安全性高于FAT文件系统,支持域的管理...

c盘格式化恢复软件(格式化c盘 软件)

点我名字,然后点“他的空间”,我的空间有各种恢复软件的详细介绍、下载地址以及使用说明。C盘格式化后需重装操作系统,系统装好后,要恢复其他盘的软件的话可以在格式化C盘前将桌面数据备份在其他盘,重装完成后...

u盘磁盘被写保护最简单解除方法

u盘磁盘被写保护解除方法,去掉u盘写保护可以先检查u盘写保护的按钮是否打开,然后在电脑上将u盘文件拷贝一份,接着右键点击u盘,选择属性选项,点击工具选项进入,点击开始检查选项,最后如果有问题点击修复即...

免费刷机工具(免费刷机工具哪个好用)

 刷机机灵你的安卓手机智能管家:刷机精灵软件是一款适用于Andorid设备的一键刷机软件。它能够自动安装设备驱动、自动获取ROOT权限、自动刷入ClockworkmodRecovery以完成Andr...

硬盘重新分区怎么分(硬盘重新分区后怎么装系统)

对已分区的硬盘重新分区的方法如下:1. 备份重要数据:重新分区会格式化硬盘,导致数据丢失。因此,在进行重新分区之前,需要备份重要数据。2. 进入磁盘管理工具:在Windows操...

一键ghost快捷键(1键ghost)

一、开机连续按F8,在系统启动菜单中,选择一键还原选项进行一键还原。二、制作启动盘重装操作系统。安装GHOST版本操作系统方法:1、将制作好的PE启动U盘插入电脑USB接口(台式用户建议将u盘插在主机...

换无线路由器需要怎么设置(换个无线路由器怎么连接)

1、线路连接,入户网线接到无线路由器的wan口;2、路由器连接,a、如果有网线,可以直接用网线接lan口和电脑网口,然后参照第三步;b、没有网线,电脑搜索路由器,然后点击连接上。然后参照第三步设置;3...

数据标注接单平台(数据标注接单平台哪个挣得多一点)

数据标注员在家可以通过以下方式接单:1.在线平台:有许多数据标注平台允许数据标注员在家完成标注任务,例如标注客、标注助手、数据堂等。这些平台提供了在线标注工具和API接口,让数据标注员可以在家里使用...

电脑垃圾怎么清理系统垃圾(电脑垃圾怎么清理干净)

电脑清理c盘空间只留系统的操作方法如下。1、打开电脑,找到我的电脑,双击我的电脑,找到盘符C的系统盘。2、找到“属性”菜单。3、点击“属性”后,系统会出现一个新的界面,在新的界面,我们找到“磁盘清理”...

显卡推荐性价比2025(显卡2020性价比)

2021年买1000块钱的这种显卡性价比最好的还是小米的显卡比较好,因为小米的电子产品呢是比较好的一款它的质量是比较好的,也是比较靠谱的,尤其是1000块钱以内买的这种显卡呢他的内存是比较大的,所以价...

thinkpad原厂系统重装方法(thinkpad如何重新装系统)

若需重装原装系统,需备份系统数据,制作启动盘或将原装系统镜像刻录至光盘或USB。进入BIOS设置,启动优先选项设定为启动盘,重启电脑。按提示选择新系统安装位置。安装完成后更新系统和驱动程序。最后恢复数...

安装系统教程win10(安装系统教程win7)

正确安装win10系统的步骤如下:1.确认电脑是否满足win10系统的最低配置要求,如CPU、内存、硬盘空间等。2.下载win10系统镜像文件,可以通过微软官网或第三方下载网站获取。3.制作U盘...

pps影音手机版下载官网(pps影音百科)

区别:1,爱奇艺主打网页播放,PPS主打客户端播放器;2,爱奇艺视频正版高清,PPS不全是高清,有部分盗版;3,爱奇艺在线播放比较好,PPS的P2P加载技术打开视频较快。1、爱奇艺PPS影音其实是爱...

百度官方下载安装免费(百度官网免费下载)

你好!有两种方法可以免费下载!第一:加入百度文库VIP看百度文库的说明,只要加入百度文库的VIP即可免费下载,不过不推荐这种还是需要花钱的方式第二:下载冰点下载器那这种方法该如何免费下载呢?下面我详细...

windows10更新文件在哪里(win10系统更新文件在哪个文件夹)
windows10更新文件在哪里(win10系统更新文件在哪个文件夹)

win10自动更新下载的文件位于C:\Windows\SoftwareDistribution\Download文件夹中。当然我们要找到哪个文件夹确切到哪个补丁并不是那么容易的,因为命名的文件夹都是长长的一段代号,一般我们要删除更新文件的...

2026-01-02 03:55 liuian