zoukankan      html  css  js  c++  java
  • 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实现。可以运行当前模块,在浏览器中打开,查看效果。

  • 相关阅读:
    Codeforces #364 DIV2
    uva10635 LIS
    hdu3714 三分找最值
    【转】三分查找
    NBUT 1457 莫队算法 离散化
    HYSBZ 2038 莫队算法
    莫队算法
    poj3417 LCA + 树形dp
    hdu3087 LCA + 暴力
    hdu2874 LCA在线算法
  • 原文地址:https://www.cnblogs.com/hyperionworld/p/5370896.html
Copyright © 2011-2022 走看看