使用Tornado作为web server framework时,是没有默认的HTTP方法实现的。而我们在日常开发中,最常用的方法恐怕就是GET和POST了,其它方法的实现基本都是被忽略的,比如 HEAD。

按照HTTP协议(RFC7231)对HEAD方法的描述:

除了服务器不能在响应中返回消息体,HEAD 方法与 GET 相同。
HEAD 请求的响应中的 HTTP 头部中包含的元信息应该与 GET 请求发送的响应中的信息相同。
该方法可用来获取请求暗示实体的元信息,而不需要传输实体本身。
该方法常用来测试超文本链接的有效性、可用性和最近的修改。

我们可以给Tornado的RequestHandler增加默认的HEAD方法实现,代码非常简单:

    def head(self, *args, **kwargs):
        return self.get(*args, **kwargs)

上述代码的作用就是将HEAD方法的请求直接使用GET方法来处理。

同时,Tornado的RequestHandler.flush会检测当前请求方法,为HEAD则响应中不包含消息体。

测试结果:

a@L:~$ curl -I http://www.luokr.com
HTTP/1.1 200 OK
Date: Wed, 21 Aug 2013 09:29:54 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 15178
Connection: keep-alive
Etag: "ce71ff811526d02b881acb486490017ba432af38"
Server: TornadoServer/3.1