werkzeug源码分析:Request

werkzeug的Request探究

werkzeug提供了Request类封装请求。位于werkzeug.wrappers模块里。

class Request(
    BaseRequest,
    AcceptMixin,
    ETagRequestMixin,
    UserAgentMixin,
    AuthorizationMixin,
    CommonRequestDescriptorsMixin,
):
    """Full featured request object implementing the following mixins:

    - :class:`AcceptMixin` for accept header parsing
    - :class:`ETagRequestMixin` for etag and cache control handling
    - :class:`UserAgentMixin` for user agent introspection
    - :class:`AuthorizationMixin` for http auth handling
    - :class:`CommonRequestDescriptorsMixin` for common headers
    """

请求对象有以下规则:

  • 请求对象是不可变对象,除非修改内部数据结构。
  • 请求对象是线程共享的,不是线程安全的。如果在多线程中使用清加锁。这个规则实际上是针对请求对象作为全局变量而言的,如flask,因此flask实现了request线程隔离。
  • 请求对象不能被序列化。

可以看出,这个类是通过继承其他类类实现功能的。基本功能由BaseRequest类提供(意味着如果不需要这些混入类的功能,Request类和BaseRequest类功能一样),其他功能由Mixin类提供。从继承的类可以看出,我们也可以通过继承新的Mixin类来增加功能。默认下继承了5个Mixin类。

  • AcceptMixin提供了解析请求头功能。
  • ETagResponseMixin提供了etag和cache处理功能。
  • UserAgentMixin提供了用户代理内省功能。
  • AuthorizationMixin提供了HTTP认证处理。
  • CommonRequestDescriptorsMixin提供了各种HTTP请求头字段描述器。

分析

先分析出现较多的两个描述器:@cached_propertyenviron_property

@cached_property
class cached_property(property):
    def __init__(self, func, name=None, doc=None):
        self.__name__ = name or func.__name__
        self.__module__ = func.__module__
        self.__doc__ = doc or func.__doc__
        self.func = func

    def __set__(self, obj, value):
        obj.__dict__[self.__name__] =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值