11
votes

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?

1
Haven't tried myself, but have a look at requests.utils.cookiejar_from_dictGermano

1 Answers

6
votes

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.