148

我正在尝试使用Requests库通过发布请求发送 cookie,但我不确定如何根据其文档实际设置 cookie。该脚本用于维基百科,需要发送的 cookie 采用以下形式:

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

但是,requests文档快速入门仅将此作为唯一示例:

cookies = dict(cookies_are='working')

如何使用此库对上述 cookie 进行编码?我是否需要使用 python 的标准 cookie 库来制作它,然后将它与 POST 请求一起发送?

4

3 回答 3

298

最新版本的 Requests 将从简单的字典为您构建 CookieJars。

import requests

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

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

享受 :)

于 2011-08-23T17:12:50.430 回答
143

只是为了扩展上一个答案,如果您将两个请求链接在一起并希望将从第一个返回的 cookie 发送到第二个(例如,跨请求保持会话活动),您可以执行以下操作:

import requests
r1 = requests.post('http://www.yourapp.com/login')
r2 = requests.post('http://www.yourapp.com/somepage',cookies=r1.cookies)
于 2012-01-23T19:06:09.780 回答
0

如果要将 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 传递给浏览器,我成功地能够使用我的 python wsgi 脚本正在运行的同一域上托管的 Bugzilla 和 TWiki 进行身份验证。这允许我在同一个浏览器中打开 Bugzilla 和 TWiki 页面并进行身份验证。我正在尝试对 SuiteCRM 做同样的事情,但我在 SuiteCRM 接受从 python 脚本获得的会话 cookie 时遇到了问题,即使它已成功通过身份验证。

于 2020-01-02T23:33:09.117 回答