【问题标题】:Update Cookies in Session Using python-requests Module使用 python-requests 模块更新 Session 中的 Cookie
【发布时间】: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中收到的回复内容。

【问题讨论】:

    标签: python oauth-2.0 session-cookies python-requests http-request


    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 2016-01-15
      • 2021-07-14
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多