18

当我使用请求访问 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 处理?

例如,如果我在禁用 cookie 处理的情况下使用 Chrome 访问上述 URL,我会得到我所期望的:

{
  "cookies": {}
}
4

4 回答 4

28

您可以通过定义拒绝所有 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因此,cookie 不会在对requests.get. 但是,如果第一页设置了 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': {}}
于 2014-02-11T22:34:55.940 回答
1
>>> 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}'
于 2013-06-11T08:08:30.217 回答
0

你回来了"k2": "v2", "k1": "v1",因为它们是在 GET 参数中发送的。如果您跟进第二个请求,您将看到您没有发送任何 cookie。除非您使用requests.Sessioncookie,否则客户端不会自动处理,您必须在每个请求中显式传递 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}'
于 2013-06-11T07:10:34.703 回答
-1
class BlockAll(CookiePolicy):
    def set_ok(self, cookie, request):
        return False
session.cookies.policy = BlockAll()
于 2013-10-22T21:51:18.010 回答