WERKZEUG中HTTP模块和自带的简易服务器程序

HTTP模块是对http数据进行加工或者判断,包括解析请求和对响应的包装。
模块中对http中各元素的处理都差不多,下面用etag举说明:
在服务端和客户端的交互通信中,有一个最重要的概念就是缓存(cache)。它的作用是将请求频繁的内容从服务端取出,copy在一个客户端和服务端中间的位置处,以加速服务端和客户端的通信,减少服务器的负担。存放这些数据的位置叫缓存代理,和路由器一样,大型的缓存代理能够存储某些共享内容,供一个区域内的客户端访问,加速这一区域类似数据的访问。浏览器也是一个缓存,也能缓存来自服务端的信息,用于浏览器自身的访问。 某些时候,服务端的原始数据会产生变化,为了使服务端和客户端的数据同步,用实体标签(etag)对特定的内容,进行唯一的标识。通过判断服务端和客户端相同内容的实体标签是否相同,就能判断服务端数据是否产生更改,如果产生更改,响应服务端的原始内容,并将缓存处的内容更新;如果没产生更改,响应缓存处的内容。详细理解关于缓存和etag的内容可以查阅:《HTTP:the definative guide》

以上介绍了缓存的内容,下面分析WERZEUG对etag的操作方法

def quote_etag(etag, weak=False):
    if '"' in etag:
        raise ValueError('invalid etag')
    etag = '"%s"' % etag
    if weak:
        etag = 'W/' + etag
    return etag

主要作用是引用etag,判断weak的值,如果weak的值为真,就加上'w/'字样;weak的作用是将内容进行模糊匹配,只用两端的内容不同之处超过一定的阈值,才响应服务端的内容。

def unquote_etag(etag):
    if not etag:
        return None, None
    etag = etag.strip()
    weak = False
    if etag.startswith(('W/', 'w/')):
        weak = True
        etag = etag[2:]
    if etag[:1] == etag[-1:] == '"':
        etag = etag[1:-1]
    return etag, weak

这个函数的作用是返回一个weaketag组成的元组。

def parse_etags(value):
    if not value:
        return ETags()
    strong = []
    weak = []
    end = len(value)
    pos = 0
    while pos < end:
        match = _etag_re.match(value, pos)
        if match is None:
            break
        is_weak, quoted, raw = match.groups()
        if raw == '*':
            return ETags(star_tag=True)
        elif quoted:
            raw = quoted
        if is_weak:
            weak.append(raw)
        else:
            strong.append(raw)
        pos = match.end()
    return ETags(strong, weak)

解析etag,返回一个Etags类型的元组。ETags内容是来自模块datastructure中的内容,这个模块中定义了需要组合起来的数据。

def generate_etag(data):
    return md5(data).hexdigest()

md5产生一个32位的通过md5算法加密的字符串,hashlib模块中包含了,很多加密算法。

servering

这是werkzeug定义的简易的服务器端,用于在开发环境中测试应用程序。是调用HTTPServer中的API实现。可以运行当前模块,在浏览器中打开,查看效果。

原文地址:https://www.cnblogs.com/hyperionworld/p/5370896.html