Как отключить обработку файлов cookie в библиотеке запросов Python?

когда я использую запросы для доступа к URL cookies автоматически отправляются обратно на сервер (в следующем примере запрошенный URL-адрес устанавливает некоторые значения cookie, а затем перенаправляет на другой URL-адрес, отображающий сохраненный cookie)

>>> import requests
>>> response = requests.get("http://httpbin.org/cookies/set?k1=v1&k2=v2")
>>> response.content
'{n  "cookies": {n    "k2": "v2",n    "k1": "v1"n  }n}'

можно ли временно отключить обработку файлов cookie таким же образом, как вы установили Chrome или Firefox, Чтобы не принимать файлы cookie?

например, если я получаю доступ к вышеупомянутому URL с Chrome с отключенной обработкой файлов cookie, я получите то, что я ожидал:

{
  "cookies": {}
}

4 ответов


вы можете сделать это, определив политику cookie для отклонения всех файлов cookie:

from http import cookiejar  # Python 2: import cookielib as cookiejar
class BlockAll(cookiejar.CookiePolicy):
    return_ok = set_ok = domain_return_ok = path_return_ok = lambda self, *args, **kwargs: False
    netscape = True
    rfc2965 = hide_cookie2 = False

(обратите внимание, что http.cookiejarAPI требует, чтобы вы определили кучу атрибутов и методов, как показано на рисунке.)

затем установите политику cookie в сеансе запросов:

import requests
s = requests.Session()
s.cookies.set_policy(BlockAll())

теперь он не будет хранить или отправлять куки:

s.get("https://httpbin.org/cookies/set?foo=bar")
assert not s.cookies

в стороне, если вы посмотрите на код, методы удобства в requests пакета (в отличие от тех, на requests.Session объект) построить новый Session каждый раз. Таким образом, cookies не сохраняются между отдельными вызовами requests.get. Однако, если первая страница устанавливает куки, а затем выдает перенаправление HTTP, целевая страница увидит куки. (Вот что происходит с HTTPBin /cookies/set вызов, который перенаправляет на /cookies.)

таким образом, в зависимости от того, какое поведение вы хотите для перенаправления, вам, возможно, не нужно делать ничего особенного. Сравнить:

>>> print(requests.get("https://httpbin.org/cookies/set?foo=bar").json())
{'cookies': {'foo': 'bar'}}
>>> print(requests.get("https://httpbin.org/cookies").json())
{'cookies': {}}

>>> s = requests.Session()
>>> print(s.get("https://httpbin.org/cookies/set?foo=bar").json())
{'cookies': {'foo': 'bar'}}
>>> print(s.get("https://httpbin.org/cookies").json())
{'cookies': {'foo': 'bar'}}

>>> s = requests.Session()
>>> s.cookies.set_policy(BlockAll())
>>> print(s.get("https://httpbin.org/cookies/set?foo=bar").json())
{'cookies': {}}
>>> print(requests.get("https://httpbin.org/cookies").json())
{'cookies': {}}

>>> import mock
>>> import requests
>>> with mock.patch.object(requests.cookies.RequestsCookieJar, 'update', lambda *args, **kwargs: 0):
...     r = requests.get("http://httpbin.org/cookies/set?k1=v1&k2=v2")#, cookies=cj)
...     r.content
... 
'{\n  "cookies": {}\n}'
>>> r = requests.get("http://httpbin.org/cookies/set?k1=v1&k2=v2")
>>> r.content
'{\n  "cookies": {\n    "k2": "v2",\n    "k1": "v1"\n  }\n}'

ты возвращаешься "k2": "v2", "k1": "v1" потому что они отправляются в GET params. Если вы выполните второй запрос, вы увидите, что вы не отправляете куки. Если вы не используете requests.Session cookies не обрабатываются автоматически в клиенте, и вы должны явно передать dict или CookieJar с каждым запросом.

In [17]: r = requests.get("http://httpbin.org/cookies/set?k1=v1&k2=v2")

In [18]: r.content
Out[18]: '{\n  "cookies": {\n    "k2": "v2",\n    "k1": "v1"\n  }\n}'

In [20]: r.cookies.get_dict()
Out[20]: {}

In [21]: r = requests.get("http://httpbin.org/cookies")

In [22]: r.content
Out[22]: '{\n  "cookies": {}\n}'

class BlockAll(CookiePolicy):
    def set_ok(self, cookie, request):
        return False
session.cookies.policy = BlockAll()