深入Python3 (Dive Into Python3)笔记14--Web 服务

本文介绍了Python中用于HTTP交互的库,包括http.client和urllib.request的基本功能与限制,并重点推荐了第三方库httplib2,该库支持缓存、ETag、压缩及重定向等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一切内容都是摘抄,主要是便于回忆和鼓励自己不要间断,更详细内容请见原帖地址:

《深入 python3 》中文版

http://woodpecker.org.cn/diveintopython3/index.html

14.1. 深入

Python 3 带有两个库用于和HTTP web 服务交互:

  • http.client 是实现了RFC 2616 , HTTP 协议的底层库.
  • urllib.request 建立在http.client 之上一个抽象层。 它为访问HTTPFTP 服务器提供了一个标准的API ,可以自动跟随HTTP 重定向, 并且处理了一些常见形式的HTTP 认证。

那么,你应该用哪个呢?两个都不用。取而代之, 你应该使用 httplib2 ,一个第三方的开源库,它比http.client 更完整的实现了HTTP 协议,同时比urllib.request 提供了更好的抽象。

14.2. HTTP的特性

14.2.1. 缓存

Python的HTTP库不支持缓存,而httplib2支持。

14.2.2. 最后修改时间的检查

Python的HTTP 库不支持最后修改时间检查,而httplib2 支持。

14.2.3. ETags

ETag 是另一个和最后修改时间检查达到同样目的的方法。使用ETag时,服务器在返回数据的同时在ETag头里返回一个哈希码(如何生成哈希码完全取决于服务器,唯一的要求是数据改变时哈希码也要改变) diveintomark.org引用的背景图片包含有ETag 头.

Python HTTP库不支持ETag,而httplib2支持.

14.2.4. 压缩

HTTP支持若干种压缩算法。最常见的两种是gzip 和 deflate。当你通过HTTP请求资源时,你可以要求服务器以压缩格式返回资源。你在请求中包含一个Accept-encoding头,里面列出了你支持的压缩算法。如果服务器也支持其中的某一种算法,它就会返回给你压缩后的数据(同时通过Content-encoding头标识它使用的算法)。接下来的事情就是由你去解压数据了。

Python的 HTTP库不支持压缩,但httplib2支持。

14.2.5. 重定向

每一次你向HTTP服务器请求资源的时候, 服务器都会在响应中包含一个状态码。 状态码200的意思是一切正常,这就是你请求的页面; 状态码404的意思是找不到页面; (你很可能在浏览网页的时候碰到过404)。300 系列的状态码意味着某种形式的重定向。

HTTP 有多种方法表示一个资源已经被移动。最常见两个技术是状态码302 和 301。 状态码 302 是一个 临时重定向; 它意味着, 资源被被临时从这里移动走了; (并且临时地址在Location 头里面给出)。状态码301是永久重定向; 它意味着,资源被永久的移动了; (并且在Location头里面给出了新的地址)。如果你得到302状态码和一个新地址, HTTP规范要求你访问新地址来获得你要的资源,但是下次你要访问同样的资源的时候你应该重新尝试旧的地址。但是如果你得到301状态码和新地址, 你从今以后都应该使用新的地址。

14.3. 避免通过 HTTP 重复地获取数据

14.4. 线路上是什么?

正如我在这章开头提到的,urllib.request 依赖另一个标准Python库, http.client。正常情况下你不需要直接接触http.client。 (urllib.request 模块会自动导入它。) 我们在这里导入它是为了让我们能够打开HTTPConnection类的调试开关,urllib.request 使用这个类去连接HTTP服务器。

 

虽然自带的库有种种问题,初学阶段,我还是先不深入研究其他了,以下关于httplib2的内容先不看了

14.5. 介绍 httplib2

14.5.1. 关于httplib2返回字节串而不是字符串的简短解释

14.5.2. httplib2怎样处理缓存。

14.5.3. httplib2怎么处理Last-Modified和ETag头

14.5.4. http2lib怎么处理压缩

14.5.5. httplib2怎样处理重定向

14.6. HTTP GET之外

POST 请求同GET 请求不同, 因为它包含负荷(payload). 负荷是你要发送到服务器的数据。这个API方法必须的参数是status, 并且它应该是URL编码过的。 这是一种很简单的序列化格式,将一组键值对(比如字典)转化为一个字符串。

add_credentials()方法的第三个参数是该证书有效的域名。你应该总是指定这个参数! 如果你省略了这个参数,并且之后重用这个httplib2.Http对象访问另一个需要认证的站点,可能会导致httplib2将一个站点的用户名密码泄漏给其他站点

14.7. HTTP POST之外

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值