Reputation: 21727
I couldn't find any documentations regarding cookies modification in the official website, i.e. no api doc for requests.cookies.RequestsCookieJar
.
For example,
session = requests.Session()
a = session.head('http://www.google.co.uk')
session.cookies
<[Cookie(version=0, name='NID', value='67=CXdvwjj9sjd-13Y0VyRQyUs8PxXaxyMhiGrrozXP7RWSjf-5alV4D17ORcfnZNYLAmlHXSVlHuS5LcuE4-v6vnzRQS-Gt72hgbGye0apoBoW5KJeVXA2o2E0gE-8jIeY', port=None, port_specified=False, domain='.google.co.uk', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1424443599, discard=False, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False), Cookie(version=0, name='PREF', value='ID=41c5d5cac7d22262:FF=0:TM=1408632399:LM=1408632399:S=wTfY_LkkZnSsBxoL', port=None, port_specified=False, domain='.google.co.uk', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1471704399, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>
Now I want to change value of 'NID'
If I do session.cookies['NID'] = 'abc'
, it would ended up with duplicated keys like the following:
<[Cookie(version=0, name='NID', value='abc', port=None, port_specified=False, domain='', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False), Cookie(version=0, name='NID', value='67=CXdvwjj9sjd-13Y0VyRQyUs8PxXaxyMhiGrrozXP7RWSjf-5alV4D17ORcfnZNYLAmlHXSVlHuS5LcuE4-v6vnzRQS-Gt72hgbGye0apoBoW5KJeVXA2o2E0gE-8jIeY', port=None, port_specified=False, domain='.google.co.uk', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1424443599, discard=False, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False), Cookie(version=0, name='PREF', value='ID=41c5d5cac7d22262:FF=0:TM=1408632399:LM=1408632399:S=wTfY_LkkZnSsBxoL', port=None, port_specified=False, domain='.google.co.uk', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1471704399, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False)]>
My current approach is to do session.cookies['NID'] = None
first, this removes the key/value, and then session.cookies['NID'] = 'abc'
This sometimes works, but it completely ignores the cookies attributes.
What is a proper way of doing it?
Upvotes: 13
Views: 17552
Reputation: 9197
For me worked:
for cookie in response.cookies:
if cookie.name == 'NID':
cookie.value = 'abc'
break
Upvotes: 1
Reputation: 1025
As you can see, your cookie has no domain specified for it, so it's actually another cookie.
Using domain and path
session.cookies.set('NID', 'abc', domain='.google.co.uk', path='/')
will set new cookie instead of the previously defined one.
RequestCookieJar
is a wrapper for cookielib.CookieJar
, but if you want to modify cookie attributes in-place (so that you reference the actual cookielib.Cookie
objects) I found no better way than to use iterator.
If you look into the sources of requests.cookies.RequestsCookieJar
there are just no other methods that let you access items themselves and not their name
/value
fields.
Upvotes: 8