Etag 笔记

用于标识出资源的状态。当资源发生变更时,如果其头信息中一个或者多个发生变化,或者消息实体发生变化,那么ETag也随之发生变化。

ETag常与If-None-Match或者If-Match一起,由客户端通过HTTP头信息(包括ETag值)发送给服务端处理。ETag使用如下:

request headers

......
If-None-Match: "3c64e7a072b3b57e100c96134e5ed2929e8dc56c"
......

response headers

HTTP/1.1 304 Not Modified

Date: Tue, 10 May 2016 06:29:05 GMT

Etag: "3c64e7a072b3b57e100c96134e5ed2929e8dc56c"

Server: TornadoServer/4.3

Tornado Etag 实现

根据请求的返回的数据_write_buffer,通过hashlib.sha1算出etag

def compute_etag(self):
    """Computes the etag header to be used for this request.

     By default uses a hash of the content written so far.

     May be overridden to provide custom etag implementations,
     or may return None to disable tornado‘s default etag support.
     """
     hasher = hashlib.sha1()
     for part in self._write_buffer:
         hasher.update(part)
     return ‘"%s"‘ % hasher.hexdigest()

通过request.headersIf-None-Match" 获取上一次的etag和这次的etag比较

 def check_etag_header(self):
        """Checks the ``Etag`` header against requests‘s ``If-None-Match``.

        Returns ``True`` if the request‘s Etag matches and a 304 should be
        returned. For example::

            self.set_etag_header()
            if self.check_etag_header():
                self.set_status(304)
                return

        This method is called automatically when the request is finished,
        but may be called earlier for applications that override
        `compute_etag` and want to do an early check for ``If-None-Match``
        before completing the request.  The ``Etag`` header should be set
        (perhaps with `set_etag_header`) before calling this method.
        """
        computed_etag = utf8(self._headers.get("Etag", ""))
        # Find all weak and strong etag values from If-None-Match header
        # because RFC 7232 allows multiple etag values in a single header.
        etags = re.findall(
            br‘\*|(?:W/)?"[^"]*"‘,
            utf8(self.request.headers.get("If-None-Match", ""))
        )
        if not computed_etag or not etags:
            return False
        match = False
        if etags[0] == b‘*‘:
            match = True
        else:
            # Use a weak comparison when comparing entity-tags.
            val = lambda x: x[2:] if x.startswith(b‘W/‘) else x
            for etag in etags:
                if val(etag) == val(computed_etag):
                    match = True
                    break
        return match

如果一样说明没改变,不返还内容只返回304

......
if self.check_etag_header():
       self._write_buffer = []
       self.set_status(304)
......
时间: 2024-09-30 23:34:14

Etag 笔记的相关文章

规模化微服务——《微服务设计》读书笔记

    系列文章目录:     <微服务设计>读书笔记大纲 改变思维的角度:故障无处不在 当微服务规模化后,故障是无可避免的,以往我们总是想尽力避免故障的发生,而当故障实际发生时,我们往往束手无策.我们花了很多时间在流程设计和应用设计的层面上来阻止故障的发生,但实际上很少花费时间思考如何第一时间从故障中恢复过来. 一些公司喜欢组织活动,活动当天系统会被关掉以模拟故障发生,然后不同团队演练如何应对这种情况.这些项目中最著名的是混乱猴子(Chaos Monkey),在一天的特定时间随机停掉服务器,

Java笔记(10)

第一天 ----- 第十天 知识点复习 day1 XML 语法和两种约束技术 1.XML语法写法.规范: 根元素必须唯一.元素名称与属性名称不能以数字开始.元素标记必须结束.元素不能交叉嵌套.属性值必须加引号(双引号.单引号) ----- 考试:排错 2.CDATA块 与 特殊字符转义在 使用上区别 ? <book> <p>标记的作用 </book>  ----- 标记内容 <p> 是一个特殊内容 CDATA : <book> <![CDA

Nginx快速入门菜鸟笔记

Nginx快速入门-菜鸟笔记   1.编译安装nginx 编译安装nginx 必须先安装pcre库. (1)uname -a 确定环境 Linux localhost.localdomain 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux (2)yum install -y pcre pcre-devel -y 必须安装pcre库(实现nginx rewrite模块功

Python个人学习笔记四

                                        本节主要学习python语言中网络相关知识. 一 主要文件和目录在Urllib的request.py模块下面.其中支持SSL加密方式访问. 下面我们看看其中的主要类和函数吧. 先看看源码吧. def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False):

Jsp之神笔记

JSP笔记 Tomcatserver port: port就是指的某一个程序网络入口,Tomcat的初始化port为:8080: port的个数:256*256=65536个: 一般常见协议的缺省port为: http                    80 smtp                  25 pop3                   110 ftp                       23 https                  443 port占用查看命令

CSS3与页面布局学习笔记(八)——浏览器兼容性问题与前端性能优化方案

一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运行平台还存在差异.屏幕分辨率不一样,大小不一样,比例不一样.兼容性主要可以分类为: 1).CSS兼容2).JavaScript兼容3).HTML兼容 这三类也是前端的主要组成部分,都存在一定的兼容性问题,知己知彼,百战百胜,我们先了解浏览器的发动机—内核. 多年前我们一直为IE6兼容烦恼,为它没少加

HTTP 1.1学习笔记

前言 由于HTTP 1自身的局限性,它不能很好的为用户提供性能良好的WEB服务.于1999年6月正式发布了HTTP1.1标准REC2616,它厘清了之前版本中很多有歧义的地方,而且还新增了很多重要的优化,如持久连接.分块编码传输.状态码扩充.增强的缓存机制.传输编码及请求管道等.本文是个人在学习<WEB性能权威指南>后,又查阅了一些文档资料写的一篇随笔,仅供参考和个人以后查阅.下面将对比http1.0讲述一些在新版本中的重要改进.(本文最初发布于公司内网,外网原文地址:腾云阁--HTTP 1.

Azure编程笔记(2):重复CloudTable的修改操作

内容提要 对MicrosoftAzure的CloudTable进行操作,有很多种操作失败的可能,比如网络连接异常,比如短时间内发送的请求数太多.很多时候我们在失败之后过一段时间再重试,就能操作成功.但是有些失败不是简单重试就解决的.本文讲述的在修改操作时候发生的PreconditionFailed错误就是一个例子. 问题描述 在上一篇博客里,我们定义一个类型Account,用来模拟社交网站的账户基本信息.这里我们继续用这个类型为例子来讲述多个线程同时发送更新请求时可能发生的问题. 我们首先用如下

Symfony2学习笔记之HTTP Cache

富web应用程序的本质意味着它们的动态.无论你的应用程序多么有效率,每个请求比起静态文件来说总会存在很多的耗费.对于大多数web程序来说,这没什么. Symfony2非常的轻快,无论你做些严重超载的请求,每个请求将会得到很快的回复,而不会对你的服务器造成压力.但是随着你站点的成长,负载将成为一个严重的问题.对每个请求处理应该只被正常执行一次.这就是缓存真正要达成的目标. 站在巨人肩膀上的缓存:提高一个应用程序执行效率的最有效方法是缓存一个页面的所有输出然后让后续的请求绕开整个应用程序.当然,这对