使用 python-requests 模块更新 Session 中的 Cookie

Posted

技术标签:

【中文标题】使用 python-requests 模块更新 Session 中的 Cookie【英文标题】:Update Cookies in Session Using python-requests Module 【发布时间】:2012-12-07 22:36:58 【问题描述】:

我正在使用 python-requests 模块来处理 oAuth 请求和响应。 我想在requests.session.cookies对象中设置收到的access_token(响应内容为dict)。

如何使用从服务器收到的响应更新现有的会话 cookie?

[编辑]

self.session = requests.session(auth=self.auth_params)
resp = self.session.post(url, data=data, headers=self.headers)
content = resp.content

我想做这样的事情:

requests.utils.dict_from_cookiejar(self.session.cookies).update(content)

这里,requests.utils.dict_from_cookiejar(self.session.cookies) 返回带有一个会话密钥的 dict。现在,我想更新self.session.cookies中收到的回复内容。

【问题讨论】:

【参考方案1】:

requests 可以为你做到这一点,只要你告诉它你所做的所有requests 都是同一个session 的一部分:

>>> import requests
>>> s = requests.session()
>>> s.get('https://www.google.com')
<Response [200]>
>>> s.cookies
<<class 'requests.cookies.RequestsCookieJar'>[Cookie(version=0, name='NID'...

使用s.gets.post 发出的后续请求将重新使用和更新cookie服务器发送回客户端。


要将您自己的 Cookie 添加到单个请求,您只需通过 cookies 参数添加即可。

>>> s.get('https://www.google.com', cookies = 'cookieKey':'cookieValue')

除非服务器为提供的 cookie 发回一个新值,否则会话将不保留提供的 cookie。

【讨论】:

谢谢,它将如何用于发布请求。你能举个例子吗? 我收到 'access_token':'Somecode' 作为响应,我想在现有会话对象的 cookie 中设置相同的字典。得到回应后。我怎样才能做到这一点? @Yajushi你不需要,只要你使用session对象,requests会在后续请求中自动重用cookies。对于post 请求,执行:s.post(url, data = k:v) 但是,我想在 session.cookies 中设置响应内容(来自发布请求)。请检查编辑。如果我误解了,请纠正我。 感谢您的快速回复。对我来说,它并没有专门针对发布请求自动更新 cookie。请检查我的答案,它对我有用。【参考方案2】:

这段代码对我有用。希望它可以对其他人有所帮助。

我想用从发布请求收到的响应值更新 session.cookies 变量。 因此,可以在另一个 post/get 请求中使用相同的请求值。

在这里,我做了什么:

1) 将请求模块更新到 1.0.3 版本。

2) 创建了 2 个函数

   session = requests.session() 
   def set_SC(cookie_val):
            for k,v in cookie_dict.iteritems():
                if not isinstance(v, str):
                    cookie_dict[k] =  str(v) 
            requests.utils.add_dict_to_cookiejar(session.cookies,
                                                 cookie_val)

    def get_SC():
            return requests.utils.dict_from_cookiejar(session.cookies)

    In another function:
    setSC(response.content)

【讨论】:

这听起来像是一种解决方法,即为什么请求不保存 post call 的 cookie?请参阅第 5.1 节示例中的ietf.org/rfc/rfc2109.txt。我会根据要求提出来【参考方案3】:

为了给requests 模块自己提供一个cookie,您可以将cookie 参数用于单个请求,并给它一个cookie jar 或包含cookie 的类似对象的dict。

>>> import requests
>>> requests.get('https://www.example.com', cookies 'cookieKey':'cookieValue')

但是如果你想保留提供的cookie而不必每次都设置cookies参数,你可以使用一个请求会话,你也可以将它传递给其他函数,以便他们可以使用和更新相同的饼干:

>>> session = requests.session()
>>> session.cookies.set('cookieKey', 'cookieName')
# In order to avoid cookie collisions
# and to only send cookies to the domain / path they belong to
# you have to provide these detail via additional parameters
>>> session.cookies.set('cookieKey', 'cookieName', path='/', domain='www.example.com')

【讨论】:

以上是关于使用 python-requests 模块更新 Session 中的 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

python-requests模块

python-requests模块

python-requests模块

python-requests模块

python-requests身份认证, 流式请求。

第三方模块requests下载