根据GAE fetch documentation,Cookie不会通过重定向处理:
重定向时不处理Cookie。如果需要cookie处理,请将follow_redirects设置为False并手动处理cookie和重定向。
所以,我正在尝试实施手动解决方案:
page = urlfetch.Fetch(
url = url,
payload = form_data,
method = urlfetch.POST,
headers = headers,
follow_redirects = False,
deadline = 60)
cookies = ''
while page.status_code == 302:
url = page.headers.get('location')
if page.headers.get('set-cookie'):
cookies = page.headers.get('set-cookie')
headers['cookie'] = cookies
page = urlfetch.Fetch(
url = url,
method = urlfetch.GET,
headers = headers,
follow_redirects = False,
deadline = 60)
if page.status_code == 200 and page.content:
self.response.out.write(page.content)
但它没有按预期工作。看起来我想念some cookies:
header_msg 包含响应头的httplib.HTTPMessage实例。如果可能有多个具有相同名称的标头(for 例如,Set-Cookie标头),调用header_msg.get_headers(header_name) 将值检索为列表。
但是我应该如何使用 header_msg ?
答案 0 :(得分:6)
如果我理解了这个问题,您希望从每个响应中收集(并累积传递)Cookie,但是使用follow_redirects = True的URLFetch只会返回上一个响应中的Cookie。此外,默认行为不实现cookie jar,这将导致后面的请求与先前响应中的Cookie
对应的右Set-Cookie
标头一起发送。据推测,初始POST是一个登录表单,重定向到期望cookie的页面,这个方案不能满足这些限制。
为此,您的代码已关闭,但cookies = page.headers.get('set-cookie')
在每次请求后都会清除之前收集的Cookie。这应该更好:
page = urlfetch.Fetch(
url = url,
headers = headers,
follow_redirects = False)
cookies = []
while page.status_code == 302:
url = page.headers.get('location')
if page.headers.get('set-cookie'):
cookies.extend(page.header_msg.getheaders('set-cookie'))
headers['cookie'] = '; '.join(cookies)
page = urlfetch.Fetch(
url = url,
method = urlfetch.GET,
headers = headers,
follow_redirects = False)
if page.status_code == 200 and page.content:
self.response.out.write(page.content)
一些警告:
Location
是相对路径,则需要修正url
。Set-Cookie
标头不仅仅是key = value(例如它已过期),您还需要解析标头值,以便只发送键/值对。有关解析的帮助,请参阅Cookie库。Set-Cookie
,此代码将很乐意发送重复的Cookie。