数据存储 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 p

PreparedRequest

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