2013-06-11 1 views
8

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

>>> 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 с обработкой отключены куки я получаю то, что я ожидал:

{ 
    "cookies": {} 
} 
+0

[Запросы - Cookies] (http://docs.python-requests.org/en/latest/user/quickstart/#cookies) из документации, они ничего о инвалидизирующих печенье не говоря уже о , Но вы можете взглянуть на https://github.com/kennethreitz/requests/blob/master/requests/cookies.py и https://github.com/kennethreitz/requests/blob/master/requests/sessions. py о том, как он обрабатывает cookiejars. – bnlucas

ответ

8

Вы можете сделать это путем определения политики куки, чтобы отклонить все куки:

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 

(Обратите внимание, что API http.cookiejar «s требует, чтобы определить кучу атрибутов и методы, как показано.)

Затем установите политику файлов 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. Поэтому куки-файлы не сохраняются между отдельными вызовами до requests.get. Однако, если первая страница устанавливает куки, а затем выдает перенаправление HTTP, на целевой странице будут отображаться файлы cookie. (Это то, что происходит с вызовом 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': {}} 
+0

Спасибо за очень подробный, ясный и подробный ответ. В частности, для объяснения перенаправления httpbin. – raben

0

Вы получаете назад "k2": "v2", "k1": "v1", потому что они послали в GET Params. Если вы выполните второй запрос, вы увидите, что вы не отправляете файлы cookie. Если вы не используете requests.Session, файлы cookie автоматически не обрабатываются клиентом, и вам необходимо явно передать 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}' 
+2

Когда вы отправляете запрос на этот URL-адрес, первый ответ с сервера устанавливает cookie в клиенте. Затем вы перенаправляетесь на новый URL-адрес, который отображает содержимое файла cookie, установленного первым ответом. Именно так httpbin.org работает специально для проверки настойчивости файлов cookie. Попытайтесь получить тот же URL-адрес с вашим браузером, если отключены файлы cookie, и вы получите пустой ответ. – raben

+0

Ах, право. Я не смог определить перенаправление. –

2
>>> 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}' 
+0

Я вижу, что это работает, но я не совсем понимаю, что происходит. Не возражаете ли вы немного объяснить? – raben

+1

Этот код patch.cookies.RequestsCookieJar.update метод не обновлять cookie. За пределами блока с исправлением патч отменяется. – falsetru

+0

http://www.voidspace.org.uk/python/mock/patch.html#patch-object – falsetru

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