数据存储 models.py
api.py 定义一系列函数作为外部使用的接口,从而可以看出两者各自的应用场景
Requst
该模块最直观的是定义了一些类,作为存储模型,也就是规定了存储各个字段
用户输入了一些列参数: method, url, headers, files, data, params, auth, cookies, hooks, json
参数较多,首先把这些分散的参数汇聚成一个Request对象
每一个参数需要校验格式化,并且与系统默认的参数合并,PreparedRequest为每个参数定义了各自处理方法
PreparedRequest是最终send的合格数据,研究每个处理方法可以加深对HTTP协议的理解,以及处理用户输入的不确定性
# Reqeust对用户输入数据首次封装
# Request也提供了封装数据处理成格式数据的方法 prepare
class Request(RequestHooksMixin):
def __init__(self,
method=None, url=None, headers=None, files=None, data=None,
params=None, auth=None, cookies=None, hooks=None, json=None):
# 定义函数参数为None,内部再用三元表达式处理成可变的数据类型
data = [] if data is None else data
files = [] if files is None else files
headers = {} if headers is None else headers
params = {} if params is None else params
hooks = {} if hooks is None else hooks
self.hooks = default_hooks()
for (k, v) in list(hooks.items()):
self.register_hook(event=k, hook=v)
self.method = method
self.url = url
self.headers = headers
self.files = files
self.data = data
self.json = json
self.params = params
self.auth = auth
self.cookies = cookies
# 执行__init__内部代码时,self这个变量是已经创建好了,可以放心使用
# d = dict() # 可变类型dict
# ret = d # ret作为返回值, d修改时ret也会跟着变动,所以放心使用self
def __repr__(self):
return '<Request [%s]>' % (self.method) # 学着定义更加明确 '<类名[标识如post]>'
def prepare(self):
# 类的使用有时也很简单,p属性与方法的结合体
p = PreparedRequest()
# p.prepare可处理的参数,初始化自带参数,绑定方法定义的参数
# 绑定方法对一些列参数进行处理,可以有直接返回值
# 也可以直接使用p,因为p是可变类型,并且还是属性和方法的结合体
p.prepare(
method=self.method,
url=self.url,
headers=self.headers,
files=self.files,
data=self.data,
json=self.json,
params=self.params,
auth=self.auth,
cookies=self.cookies,
hooks=self.hooks,
)
# pp 很神奇
return pPreparedRequest
PreparedRequest对象p是最终发送时符合HTTP协议规范的数据集合。parepare接收的10个参数经过处理封装到self属性上,结合HTTP协议,分析每个self.prepare_*绑定方法
prepare_method
prepare_url
prepare_headers
prepare_cookies
prepare_body
Response
requests会把HTTP返回的信息以对象的形式存储,那类Response就是存储的模型。模型一般是有初始值,在使用的过程中会赋值不同值,满足不同HTTP的返回对象。类Response必然符合HTTP返回信息的相关字段
返回状态码 status_code和描述短语 reason
返回头部字段 headers,以及cookies
网络传输必然涉及到bytes内容的存储 _content和编码信息encoding
整个过程的日志记录信息等 url, history, request, elapsed等
以及其他所需的状态表示和演化而来的property等
从数据流转角度,包括定义模型类,向模型类写数据,从模型类读数据
定义模型类
def __init__(self):pass,可以理解为建立库表字段时,定义哪些字段并附加初始值。类的优势可以根据初始属性字段推导出更符合上层使用接口,可仔细分析它们之间的层次结构

向模型类写数据
代码写的太好了,不忍加注释,整个过程是属性的确定,没有涉及到Response绑定方法
从模型类读数据
具体Response的使用方式,参考官方文档
Last updated