如何使用Python Requests库在发布请求中发送Cookie?


94

我正在尝试使用Requests库发送带有后期请求的cookie,但是我不确定如何根据其文档实际设置cookie。该脚本可在Wikipedia上使用,并且需要发送的cookie具有以下形式:

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

但是,requests文档快速入门仅以此为例:

cookies = dict(cookies_are='working')

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


2
您的Cookie由许多a=b;对组成。猜测一下,a用作b字典中的键和值。
Thomas K

Answers:


214

最新版本的“请求”将通过简单的词典为您构建CookieJars。

import requests

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

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

请享用 :)


该代码是否应该在我的浏览器中放置cookie?我尝试过,但对我没有用。
克里斯·尼尔森

15
@ChrisNielsen这个问题/答案与浏览器无关
ThiefMaster

@ ThiefMaster:通常,cookies存在于浏览器中。如果此答案与浏览器无关,那么它又有什么关系呢?
克里斯·尼尔森

4
@ChrisNielsen:这个问题和答案中的代码是关于在Python请求中设置cookie。该请求执行的操作类似于浏览器请求,但不涉及浏览器。
DDay

118

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

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

54
另外,您可以使用requests.session此功能,在多个会话中存储cookie,session而从返回的对象进行调用。
TankorSmash 2012年

7
即使有时使用会话,我也必须利用这一点。在某些情况下,会话似乎会错过Set-Cookie标头。
kervin

1
@kervin这也发生在我身上。似乎是请求中的错误,因为会话应该处理该错误。
deweydb

3
@TankorSmash肯定有一个错误,我的Cookie未被使用request.session
Tjorriemorrie 2014年

这是在会话中设置(丢失)cookie的最佳方法吗?stackoverflow.com/a/17240616/143397
davidA 2014年

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]

通过将auth user / password传递给我的python脚本并将cookie传递给浏览器,我能够成功地通过托管在同一域中的Bugzilla和TWiki进行身份验证,而python wsgi脚本正在运行。这使我可以在同一浏览器中打开Bugzilla和TWiki页面并进行身份验证。我正在尝试对SuiteCRM执行相同的操作,但是即使SuiteCRM已成功通过身份验证,我也无法接受从python脚本获得的会话cookie。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.