使用 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)
我有一个案例需要从重定向响应(例如登录页面)中提取 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)