当我使用请求访问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": {}
}
答案 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()