如何使用Python Requests库在POST请求中发送cookies?

186

我正在尝试使用Requests库发送带有cookie的POST请求,但根据文档,我不确定如何设置cookie。该脚本将用于维基百科,需要发送的cookie格式如下:

enwiki_session=17ab96bd8ffbe8ca58a78657a918558e; path=/; domain=.wikipedia.com; HttpOnly

然而,requests文档快速入门仅提供以下示例:

cookies = dict(cookies_are='working')

如何使用这个库来编码类似上面的cookie?我需要使用Python标准cookie库创建它,然后将其与POST请求一起发送吗?

3
您的 cookie 包含若干个 a=b; 对。猜测可将 a 作为键,b 作为值,存储在字典中。 - Thomas K
3个回答

351

最新版的Requests可以从简单的字典中为你构建CookieJars。

import requests

cookies = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}

r = requests.post('http://wikipedia.org', cookies=cookies)

祝您愉快 :)


这段代码是否应该在我的浏览器中放置一个cookie?我尝试了一下,但对我没有起作用。 - Chris Nielsen
34
@ChrisNielsen 这个问题/答案与浏览器无关。 - ThiefMaster
@ThiefMaster:通常,cookie 存在于浏览器中。如果这个答案与浏览器无关,那它与什么有关呢? - Chris Nielsen
14
这个问题和答案中的代码是关于在Python请求中设置cookie的。该请求类似于浏览器请求,但没有涉及任何浏览器。 - DDay
1
@ChrisNielsen:Cookies是基本HTTP协议的一个方面,最常由浏览器使用:https://datatracker.ietf.org/doc/html/rfc6265 - serv-inc

157

为了进一步扩展之前的回答,如果您正在链接两个请求并希望将第一个请求返回的 cookies 发送到第二个请求(例如,在跨请求保持会话活动时),您可以执行以下操作:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)

65
此外,您可以使用 requests.session 来实现此操作,将 cookies 存储在多个会话中,并从返回的 session 对象中发出调用。 - TankorSmash
9
有时候,即使在使用会话时,我也不得不使用它。在某些情况下,会话似乎会错过Set-Cookie头部信息。 - kervin
2
@kervin,我也遇到了同样的问题。看起来这是requests中的一个bug,因为session 应该 处理它。 - deweydb
4
@TankorSmash,肯定存在一个错误,我的 cookie 在使用 request.session 时没有被传递。 - Tjorriemorrie
非常古老的答案,但是对我帮助很大。由于某种原因,在使用Session()对象时,我遇到了cookie持久化的问题,但这个方法完美解决了我的问题。 - alphazwest
显示剩余3条评论

1

如果你想将cookie传递给浏览器,你必须将其附加到要发送回去的头部。如果你正在使用wsgi:

import requests
...


def application(environ, start_response):
    cookie = {'enwiki_session': '17ab96bd8ffbe8ca58a78657a918558'}
    response_headers = [('Content-type', 'text/plain')]
    response_headers.append(('Set-Cookie',cookie))
...

    return [bytes(post_env),response_headers]

我已经成功地通过将认证用户/密码传递给我的Python脚本并将cookie传递给浏览器,与托管在同一域上的Bugzilla和TWiki进行身份验证。这使我能够在同一浏览器中打开Bugzilla和TWiki页面并进行身份验证。我正在尝试使用SuiteCRM做同样的事情,但是我遇到了问题,即使它已经成功验证,SuiteCRM也无法接受从Python脚本获取的会话cookie。


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