使用 tornado.httpclient.AsyncHTTPClient 在重定向响应上访问 header?

Access header on redirect response with tornado.httpclient.AsyncHTTPClient?

我有一个案例需要从重定向响应(例如登录页面)中提取 cookie。

我已经阅读了文档,甚至是源代码,但仍然找不到执行此操作的方法。

默认情况下,AsyncHTTPClient 将遵循重定向和 return 重定向的响应,其中不包含 Set-Cookie 因此无用。如果给定选项 follow_redirects=False,它会抛出一个 HTTPError 只是因为响应代码不是 200。我也尝试了阻塞 HTTPClient class,它是一样的。

那么,正确的做法是什么?我认为当用户成功登录时,服务器将发送 Set-Cookie header 和 Location header 是一种常见的方式。

这算不算bug?或者,设计缺陷?

您可以从 HTTPError.response 属性中提取 HTTPResponse object,包括其 headers:

http://tornado.readthedocs.org/en/latest/httpclient.html#tornado.httpclient.HTTPError

以下代码对此进行了演示:

from tornado.ioloop import IOLoop
from tornado import gen
from tornado.httpclient import AsyncHTTPClient, HTTPError

client = AsyncHTTPClient()


@gen.coroutine
def fetch():
    try:
        yield client.fetch('http://tornadoweb.org', follow_redirects=False)
    except HTTPError as e:
        print 'response:'
        print e.response
        print
        print 'headers:'
        print e.response.headers


IOLoop.current().run_sync(fetch)