如何使用Python请求库禁用cookie处理?

时间:2013-06-11 06:20:24

标签: python cookies python-requests

当我使用请求访问URL时 cookie会自动发送回服务器(在以下示例中,请求的URL设置了一些cookie值,然后重定向到另一个显示存储cookie的URL)

>>> 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}'

是否可以像将Chrome或Firefox设置为不接受Cookie一样临时禁用Cookie处理?

例如,如果我使用Chrome访问上述网址并禁用Cookie处理,我就会得到我的预期:

{
  "cookies": {}
}

4 个答案:

答案 0 :(得分:11)

您可以通过定义拒绝所有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())

现在不会存储或发送Cookie:

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

顺便说一句,如果你看一下代码,requests包中的便捷方法(而不是requests.Session对象上的方法)每次构造一个新的Session。因此,在requests.get的单独调用之间不会保留cookie。但是,如果第一页设置了cookie然后发出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': {}}

答案 1 :(得分: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}'

答案 2 :(得分:0)

你回来了"k2": "v2", "k1": "v1",因为他们是在GET参数中发送的。如果您跟进第二个请求,您将看到您不发送任何cookie。除非您使用requests.Session cookie,否则客户端不会自动处理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}'

答案 3 :(得分:0)

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