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
这个函数的作用是返回一个weak和etag组成的元组。
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实现。可以运行当前模块,在浏览器中打开,查看效果。