如何在Python Requests库中在POST请求中发送Cookie?

191 投票
4 回答
443930 浏览
提问于 2025-04-17 00:12

我正在尝试使用Requests库发送带有cookie的POST请求,但我不太确定如何根据文档来设置这些cookie。这个脚本是用在维基百科上的,需要发送的cookie格式是这样的:

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

不过,requests文档中的快速入门只给出了这个例子:

cookies = dict(cookies_are='working')

我该如何使用这个库来编码像上面那样的cookie呢?我需要先用Python的标准cookie库创建它,然后再和POST请求一起发送吗?

4 个回答

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 wsgi脚本和Bugzilla、TWiki进行身份验证。我把用户和密码传给我的python脚本,然后把cookie传给浏览器。这样我就可以在同一个浏览器里打开Bugzilla和TWiki的页面,并且保持登录状态。我现在想用SuiteCRM做同样的事情,但遇到了问题,虽然我已经成功登录,但SuiteCRM却不接受从python脚本获得的会话cookie。

160

为了更好地理解之前的回答,如果你想把两个请求连接起来,并且想把第一个请求返回的 cookies 发送到第二个请求(比如说,保持会话在多个请求之间有效),你可以这样做:

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

最新版本的Requests库可以根据简单的字典自动为你创建CookieJar。

import requests

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

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

希望你喜欢这个功能 :)

撰写回答