Как отключить обработку файлов 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.cookiejar
API требует, чтобы вы определили кучу атрибутов и методов, как показано на рисунке.)
затем установите политику 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()