colinfang
colinfang

Reputation: 21727

How to modify cookies in Requests

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

Answers (2)

Andreas
Andreas

Reputation: 9197

For me worked:

for cookie in response.cookies:
    if cookie.name == 'NID':
        cookie.value = 'abc'
        break

Upvotes: 1

qwm
qwm

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

Related Questions