Python:请求之间的Cookies不能保留

4
我正在使用这段代码登录到一个网站。在POST请求后,网站将重定向到个人资料页面,我可以看到我已经登录。但即使我存储了cookie,下一个请求也无法保持登录状态。这并不特别针对pastebin网站,所以请不要告诉我使用他们的API。
def web_login(username,password):
        LOGIN_URL = 'http://pastebin.com/login.php'
        HOME_URL = 'http://pastebin.com/'
        jar = cookielib.CookieJar()
        payload = {"user_name":username,"user_password":password,"submit_hidden":"submit_hidden"}
        s = requests.Session()
        user_agent = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0'}
        r = s.post(LOGIN_URL,data=payload,headers=user_agent,cookies=jar)
        r = s.get(HOME_URL,headers=user_agent,cookies=jar)        
        print r.text

4
当你在 postget 中丢弃 , cookies=jar 时会发生什么? - falsetru
1个回答

4

正如 @falsetru 指出的那样,您的问题在于使用了外部 cookie jar。原因是每个 Session 对象都有自己的 cookie jar,并会自动为您存储它们。向 cookies 传递一个值会告诉 Session 偏好使用传入的 jar 而不更新其内部的 jar。如果您想更明确一些,可以这样做:

r = s.post(LOGIN_URL, data=payload, headers=user_agent)
jar = r.cookies
home = s.get(HOME_URL, headers=user_agent, cookies=jar)

另外需要注意的是,如果你每次都发送相同的标头,则可以这样做:
s = requests.Session()
s.headers.update(user_agent)
r = s.post(LOGIN_URL, data=payload)
home = s.get(HOME_URL)

我希望这能帮助你理解为什么@falsetru告诉你的方法可行,并对那些看到这篇文章的人有所帮助。

我还应该指出,如果你想使用一个提供与cookielib.CookieJar相同接口的自定义cookie jar,你也可以这样做:

jar = MyCookieJar()
s = requests.Session()
s.cookies = jar
r = s.post(LOGIN_URL, data=payload)
home = s.get(HOME_URL)

然后您可以通过jars.cookies两种方式访问您的cookie。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接