requests库源码分析(一)

本文详细介绍了Python的requests库,包括其核心功能Request对象和PreparedRequest类的使用,如何通过Session和HttpAdapter发送请求,以及Response对象的构建过程,揭示了请求处理的基本流程。
摘要由CSDN通过智能技术生成


前言

据说,python的requests库是极具pythonic风格的三方库,于是决定认真阅读一番requests源码,记录总结一番,以飨读者。


一、requests是什么?

requests三方库集成了各种形式的http请求功能,可以很方便用户使用。以下是一个简单的requests例子。

import requests
import json
import urllib

def do_request():
    try:
        r = requests.request("GET", url="https://baidu.com")

        r.raise_for_status()

        data = r.content.decode("utf-8")
        json_data = json.loads(data)

        return data
    except requests.exceptions.HTTPError as ex:
        raise Exception("status code error!")
    except Exception as why:
        raise Exception("connection failed!")

requests模块分为三个模块:
1、构建Request
2、发送Request请求
3、构建Response

二、Request请求对象

Request请求包含两个类:Request、PreparedRequest

1.Request类

Request类(示例):

import requests
req = requests.Request('GET', 'https://httpbin.org/get')
req.prepare()

Request类中最重要的是一个prepare方法,该方法就是构造了一个PreparedRequest对象,该对象实际上就是一个Request的初始化对象,因为Request类的__init__方法实际只为参数设置空的默认值。

2.PreparedRequest类

代码如下(示例):

import requests
req = requests.Request('GET', 'https://httpbin.org/get')
r = req.prepare()
print(r) # <PreparedRequest [GET]>
s = requests.Session()
resp = s.send(r)
print(resp) # <Response [200]>

PreparedRequest对象实际上是Request类的真正的初始化对象,PrepareRequest类有一对的prepare方法,比如prepare_cookies、prepare_headers,这些方式才是真正的初始化方法。


三、发送Request请求

1.Request类

Session类:

with requests.Session() as s:
	s.get('https://httpbin.org/get')

Session类主要提供cookie持久化、http请求连接池的作用。Session类有一个request方法,该方法是整个模块的核心,包括初始化Request对象、PreparedRequest对象,发送PreparedRequst对象,构建Response对象。
request方法的核心是send方法,该方法会获取HttpAdapter类的send方法来发送请求和接收响应。

2.HttpAdapter类

HttpAdapter类:

import requests
s = requests.Session()
a = requests.adapters.HTTPAdapter(max_retries=3)
s.mount('http://', a)

HttpAdapter类,顾名思义,这是一个适配器类(适配器模式),可以根据不同的数据流选择合适的转接口进行转换后,再统一进行处理。在本模块中,适配器初始化了一个连接池管理器,然后设置了连接池个数(可以认为是一个主机一个连接池),以及每个连接池中最大连接个数。
HttpAdapter类有一个send方法,这个send方法就是HttpAdapter的核心,该方法调用了urllib3的方法来发送PreparedRequest请求,然后获取响应。然后构建一个Reponse对象返回给Session类的send调用方法。

四、构建Response响应

Response类的content、encoding、text、json、raise_for_status方法需要了解。
content = text (字节流)通过以encoding格式解码而成的字符串
json则是content基础上转换成对象
raise_for_status 在响应码不等于200即抛出异常

总结

以上就是对request模块中核心的几个类之间的相互关系做了一个简单的介绍,初步了解了requests中一个请求的具体流程以及核心的发送请求的方法:urllib3的urlopen方法。

  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值