2015-02-05 5 views
1

У меня есть случай, когда мне нужно извлечь файлы cookie из ответа перенаправления (например, страница входа в систему).Заголовок доступа для ответа на перенаправление с помощью tornado.httpclient.AsyncHTTPClient?

Я прочитал документ, даже исходный код, но до сих пор не могу найти способ сделать это.

По умолчанию AsyncHTTPClient будет следовать за перенаправлением и возвращать перенаправленный ответ, который не содержит Set-Cookie таким образом бесполезным. Если данный параметр follow_redirects=False, он выкинет HTTPError только потому, что код ответа не 200. Я также пробовал блокировать класс HTTPClient, это то же самое.

Итак, каков правильный способ сделать это? Я думаю, что общий способ заключается в том, что сервер будет отправлять заголовок Set-Cookie вместе с заголовком Location при успешном входе в систему.

Может ли это быть ошибкой? Или, дефицит дизайна?

ответ

2

Вы можете извлечь объект HTTPResponse, включая заголовки, из атрибута HTTPError.response:

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) 
+1

И в Tornado 4.1 (еще не выпущен, но это будет в течение нескольких дней), вы сможете передать 'raise_error = False'), поэтому коды ответов, отличные от 200, не будут вызывать исключения. –