Python站
  • 说明
  • 源码分析
  • 100 系列
  • python
    • 开发基础
      • 数据类型
      • 字符编码
      • 文本操作
      • 玩转Python100解
    • 函数编程
      • 装饰器
      • 内置函数
        • vars
      • 内置模块
        • enum
        • os
        • argparse
        • importlib
        • shelve
        • collections
        • re
      • 神奇三方
        • setuptools
        • celery
    • 面向对象
      • 面向对象100解(草稿)
    • 网络编程
      • 网络理论知识
      • 网络编程socket
      • socketserver源码泛读
    • 并发编程
      • 并发编程之多进程
        • 子进程基本使用
        • 进程的属性或方法
        • 守护进程
        • 互斥锁
        • 队列
        • 生产者消费者模型
      • 并发编程之多线程
        • 子线程基本使用
        • GIL全局解释器锁
        • 死锁现象与递归锁
        • 信号量事件定时器
        • 线程队列queue
      • 并发编程之进程线程池
      • 并发编程之协程
      • 并发编程之IO模型
        • 阻塞IO
        • 非阻塞IO
        • 多路复用IO
        • 异步IO
        • IO模型比较分析
    • 数据库说
      • mongoengine源码精读
    • 前端开发
    • 后端开发
      • flask源码精读
      • django源码精读
        • 01 软件打包与部署
        • 02 python调试工具 pdb
        • 03 创建一个django项目
    • 爬虫相关
      • Jupyter Notebook
      • urllib
      • urllib3源码泛读
      • 数据解析
      • requests源码精读
        • 初始化说 __init__.py
        • 版本信息 __version__.py
        • 版本兼容 compat.py
        • 经典视图 api.py
        • 逻辑实现 sessions.py
        • 数据存储 models.py
        • 网络传输 adapters.py
        • 异常结构 exceptions.py
        • 交互协定 status_code.py
        • 钩子编程 hooks.py
        • 数据结构 structures.py
        • 辅助输出 utils.py
        • 安全认证 auth&certs.py
    • 编程思想
      • 算法
      • 数据结构
      • 设计模式
        • 简单工厂模式
        • 工厂方法模式
        • 抽象工厂模式
        • 建造者模式
        • 单例模式
        • 适配器模式
        • 桥模式
        • 组合模式
        • 外观模式
        • 代理模式
        • 责任链模式
        • 观察者模式
        • 策略模式
        • 模板方法模式
      • Python技巧100解
      • Effective Python
    • 企业应用
      • DevOps
      • Web服务-Nginx
      • 网站发布
      • 源码管理
        • Git
        • GitHub
        • GitLab
      • Golang
      • Docker
      • Ubuntu
    • 项目实战
    • 就业相关
    • 其他爱好
      • 科技单词100解答
Powered by GitBook
On this page
  • 背景理论
  • 源码分析
  1. python
  2. 爬虫相关
  3. requests源码精读

逻辑实现 sessions.py

背景理论

编程中何时使用函数和类是很有意思的一件事

函数具有确定性,只要根据定义的参数调用即可

  • 可充当类对象上层的对外使用接口,如api.py

  • 作用于变量,驱动变量变化,达到目标

  • 也可以说隐藏处理的细节,简化调用接口

类的三大特性决定了类是一种更复杂的结构

  • 类是一系列变量存储的集合,__init__决定了对象初始的变量定义

  • 内部方法是用来操作这些变量的

  • 继承和组合让嵌套更加复杂

源码分析

class Session(SessionRedirectMixin):
    __attrs__ = [
        'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify',
        'cert', 'prefetch', 'adapters', 'stream', 'trust_env',
        'max_redirects',
    ]
    # 初始化Session对象含有的属性值,可以理解定义库表时有哪些字段以及默认值
    def __init__(self):
        # 组合一般用法 name = Class(), 当对象较复杂时,可用函数隐藏细节,简化调用,提现编程思想
        # headers HTTP协议中传输的元数据字段信息
        self.headers = default_headers()

        self.auth = None
        self.proxies = {}
        
        # 详解钩子编程hooks.py
        self.hooks = default_hooks()
        
        # 类Session是一个复合结构,包含对Request,Response等处理,需要控制参数来适用不同场景
        self.params = {}
        self.stream = False
        self.verify = True
        self.cert = None
        self.max_redirects = DEFAULT_REDIRECT_LIMIT
        self.trust_env = True
        self.cookies = cookiejar_from_dict({})

        # 类内部经典处理逻辑
        # 定义一个变量 self.adapters = {}
        # 向该变量写数据的方法 self.mount()
        # 从该变量读数据的方法 self.get_adapter()
        self.adapters = OrderedDict()
        self.mount('https://', HTTPAdapter())
        self.mount('http://', HTTPAdapter())

    def __enter__(self):
        return self
    def __exit__(self, *args):
        self.close()

    # 初始化的参数模具已准备好,借助绑定方法去获取外部参数,加工,得到符合规定的参数
    # 绑定方法也是可以区分层次的
    #  - 从api.py得知,session对象的入口方法为request,会重点分析这个内部处理逻辑
    #  - 同样,在底层方法request之上提供其他具体使用场景的方法,通过调用self.request
    #  - get, options,head,post,put,patch,delete, 即session.get(url)的由来
    
    # 当需要处理的参数较多,且每个参数都会有自己的处理逻辑时,requests给我们提供了很好的案例,逐步处理
    # 定义req = Request(**kw) 保存初始接收到的参数,此时相当于把分散的参数汇集起来
    # 定义p = PreparedRequest() 这个类对象更像一个工具类,p.prepare(req各个参数)
    # p.prepare中可以实现每个参数的处理逻辑,最终得的符合条件的p,传给底层send发送即可
    
    def prepare_request(self, request):
        pass

    def request(self, method, url,
            params=None, data=None, headers=None, cookies=None, files=None,
            auth=None, timeout=None, allow_redirects=True, proxies=None,
            hooks=None, stream=None, verify=None, cert=None, json=None):

    def get(self, url, **kwargs):

    def options(self, url, **kwargs):

    def head(self, url, **kwargs):

    def post(self, url, data=None, json=None, **kwargs):

    def put(self, url, data=None, **kwargs):

    def patch(self, url, data=None, **kwargs):

    def delete(self, url, **kwargs):

    # 底层发送逻辑,上层接口调用时简单明了
    def send(self, request, **kwargs):

    def merge_environment_settings(self, url, proxies, stream, verify, cert):
        
    def get_adapter(self, url):

    def close(self):

    def mount(self, prefix, adapter):
    
    # pickle模块序列化的时候,涉及的相关字段
    def __getstate__(self):
        # list推导出dict, 常用技巧
        state = {attr: getattr(self, attr, None) for attr in self.__attrs__}
        return state

    def __setstate__(self, state):
        # self存储容器,存储池,存储对象,存储模型,而getattr setattr操作存储的方法
        for attr, value in state.items():
            setattr(self, attr, value)

核心结构图

Previous经典视图 api.pyNext数据存储 models.py

Last updated 5 years ago