Python SimpleCookie 和 JSON 值
Python SimpleCookie and JSON Value
在使用 JSON 字符串作为值时,我 运行 在使用 Python 的 SimpleCookie
时遇到了一些问题。
In [1]: from http.cookies import SimpleCookie
In [2]: cookie = SimpleCookie('x=1; json={"myVal":1}; y=2')
In [3]: cookie.keys()
Out[3]: dict_keys(['x'])
In [4]: cookie = SimpleCookie('x=1; y=2')
In [5]: cookie.keys()
Out[5]: dict_keys(['y', 'x'])
不仅缺少 JSON 字符串,而且随后出现的所有其他值也都丢失了。我现在想知道这是否是一个与 Python 相关的错误,因为字符应该都可以用于 cookie?
目前您正在尝试使用对象作为值,而不是该对象的 JSON 字符串表示形式。您需要在参数字符串中转义 JSON 字符串,如下所示:
>>> from http.cookies import SimpleCookie
>>> cookie = SimpleCookie(r'x=1; json="{\"myVal\":1}"; y=2')
# ^ note raw string ^ and single backslashes
>>> cookie.keys()
dict_keys(['json', 'x', 'y'])
一个畸形的字符串被尽可能地悄悄地消耗掉,而其余的被丢弃,这看起来确实很奇怪;我希望您能输入 ValueError
或其他内容。 The parser 只是停止并且 returns 目前为止的结果是 运行 与正则表达式匹配的结果。
鉴于 ,它似乎适用于 3.3.2 但不适用于 3.5.2(而且,对我来说,它看起来不应该适用于 任何地方; 一个隐含的 JSON 包导入?!)我去搜索它何时更改。使用此脚本:
from http.cookies import SimpleCookie
import json
from sys import version
print(version)
cookie1 = SimpleCookie('x=1; json=json.dumps({"myVal":1}); y=2')
print('Marius ', cookie1.keys(), repr(cookie1.get('json')), sep='\t')
cookie2 = SimpleCookie(r'x=1; json="{\"myVal\":1}"; y=2')
print('Jonathan', cookie2.keys(), repr(cookie2.get('json')), sep='\t')
cookie3 = SimpleCookie('x=1; json={"myVal":1}; y=2')
print('Bernhard', cookie3.keys(), repr(cookie3.get('json')), sep='\t')
and pyenv
on Mac OS X 给出了 3.3 的以下结果:
3.3.0 (default, Jul 7 2016, 10:47:41)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['x', 'y', 'json']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['x', 'y', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['x', 'y', 'json']) <Morsel: json='{'>
3.3.1 (default, Jul 7 2016, 10:53:06)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['json', 'x', 'y']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['json', 'x', 'y']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['json', 'x', 'y']) <Morsel: json='{'>
3.3.2 (default, Jul 6 2016, 22:02:23)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['json', 'y', 'x']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['json', 'y', 'x']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['json', 'y', 'x']) <Morsel: json='{'>
# ...loses 'json'
3.3.3 (default, Jul 7 2016, 10:57:02)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['x', 'y']) None
Jonathan dict_keys(['x', 'y', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['x', 'y']) None
3.3.4 (default, Jul 7 2016, 10:59:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['y', 'x']) None
Jonathan dict_keys(['y', 'x', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['y', 'x']) None
3.3.5 (default, Jul 7 2016, 11:01:45)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['y', 'x']) None
Jonathan dict_keys(['json', 'y', 'x']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['y', 'x']) None
# ...and now 'y'!
3.3.6 (default, Jul 7 2016, 11:03:40)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['x']) None
Jonathan dict_keys(['json', 'x', 'y']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['x']) None
从那里开始似乎稳定了:
3.4.4 (default, Jul 7 2016, 11:13:43)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['x']) None
Jonathan dict_keys(['json', 'y', 'x']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['x']) None
3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
Marius dict_keys(['x']) None
Jonathan dict_keys(['x', 'json', 'y']) <Morsel: json="{\"myVal\":1}">
Bernhard dict_keys(['x']) None
从 3.3.6 开始的版本显然是一个安全修复;参见 this bug report。 3.2.6也应用了这个,所以:
3.2.4 (default, Jul 7 2016, 11:05:33)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['y', 'x', 'json']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['y', 'x', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['y', 'x', 'json']) <Morsel: json='{'>
3.2.5 (default, Jul 7 2016, 11:07:15)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['y', 'x', 'json']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['y', 'x', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['y', 'x', 'json']) <Morsel: json='{'>
# ...loses 'y'?!
3.2.6 (default, Jul 7 2016, 11:09:00)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['x', 'json']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['y', 'x', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['x', 'json']) <Morsel: json='{'>
此行为与具有相同错误修复的 3.3.6 不同!事实上,它将 cookie 中 json
的值设置为 '{'
,丢弃该值的其余部分和 y
.
我的结论是:
- 我的版本适用范围更广;
- Marius 的版本实际上对 OP 没有帮助,因为它与原始版本具有相同的密钥;和
- 3.2 和 3.3 中的此功能发生了一些奇怪的事情!
这包括 'json'
作为 Python 3.3.2 及更早版本中的键:
>>> import json
>>> from http.cookies import SimpleCookie
>>> cookie = SimpleCookie('x=1; json=json.dumps({"myVal":1}); y=2')
>>> cookie.keys()
dict_keys(['y', 'x', 'json'])
然而,该值可能与预期的不同:
>>> print(cookie)
Set-Cookie: json=json.dumps({
Set-Cookie: x=1
Set-Cookie: y=2
在使用 JSON 字符串作为值时,我 运行 在使用 Python 的 SimpleCookie
时遇到了一些问题。
In [1]: from http.cookies import SimpleCookie
In [2]: cookie = SimpleCookie('x=1; json={"myVal":1}; y=2')
In [3]: cookie.keys()
Out[3]: dict_keys(['x'])
In [4]: cookie = SimpleCookie('x=1; y=2')
In [5]: cookie.keys()
Out[5]: dict_keys(['y', 'x'])
不仅缺少 JSON 字符串,而且随后出现的所有其他值也都丢失了。我现在想知道这是否是一个与 Python 相关的错误,因为字符应该都可以用于 cookie?
目前您正在尝试使用对象作为值,而不是该对象的 JSON 字符串表示形式。您需要在参数字符串中转义 JSON 字符串,如下所示:
>>> from http.cookies import SimpleCookie
>>> cookie = SimpleCookie(r'x=1; json="{\"myVal\":1}"; y=2')
# ^ note raw string ^ and single backslashes
>>> cookie.keys()
dict_keys(['json', 'x', 'y'])
一个畸形的字符串被尽可能地悄悄地消耗掉,而其余的被丢弃,这看起来确实很奇怪;我希望您能输入 ValueError
或其他内容。 The parser 只是停止并且 returns 目前为止的结果是 运行 与正则表达式匹配的结果。
鉴于
from http.cookies import SimpleCookie
import json
from sys import version
print(version)
cookie1 = SimpleCookie('x=1; json=json.dumps({"myVal":1}); y=2')
print('Marius ', cookie1.keys(), repr(cookie1.get('json')), sep='\t')
cookie2 = SimpleCookie(r'x=1; json="{\"myVal\":1}"; y=2')
print('Jonathan', cookie2.keys(), repr(cookie2.get('json')), sep='\t')
cookie3 = SimpleCookie('x=1; json={"myVal":1}; y=2')
print('Bernhard', cookie3.keys(), repr(cookie3.get('json')), sep='\t')
and pyenv
on Mac OS X 给出了 3.3 的以下结果:
3.3.0 (default, Jul 7 2016, 10:47:41)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['x', 'y', 'json']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['x', 'y', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['x', 'y', 'json']) <Morsel: json='{'>
3.3.1 (default, Jul 7 2016, 10:53:06)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['json', 'x', 'y']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['json', 'x', 'y']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['json', 'x', 'y']) <Morsel: json='{'>
3.3.2 (default, Jul 6 2016, 22:02:23)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['json', 'y', 'x']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['json', 'y', 'x']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['json', 'y', 'x']) <Morsel: json='{'>
# ...loses 'json'
3.3.3 (default, Jul 7 2016, 10:57:02)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['x', 'y']) None
Jonathan dict_keys(['x', 'y', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['x', 'y']) None
3.3.4 (default, Jul 7 2016, 10:59:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['y', 'x']) None
Jonathan dict_keys(['y', 'x', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['y', 'x']) None
3.3.5 (default, Jul 7 2016, 11:01:45)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['y', 'x']) None
Jonathan dict_keys(['json', 'y', 'x']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['y', 'x']) None
# ...and now 'y'!
3.3.6 (default, Jul 7 2016, 11:03:40)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['x']) None
Jonathan dict_keys(['json', 'x', 'y']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['x']) None
从那里开始似乎稳定了:
3.4.4 (default, Jul 7 2016, 11:13:43)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['x']) None
Jonathan dict_keys(['json', 'y', 'x']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['x']) None
3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
Marius dict_keys(['x']) None
Jonathan dict_keys(['x', 'json', 'y']) <Morsel: json="{\"myVal\":1}">
Bernhard dict_keys(['x']) None
从 3.3.6 开始的版本显然是一个安全修复;参见 this bug report。 3.2.6也应用了这个,所以:
3.2.4 (default, Jul 7 2016, 11:05:33)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['y', 'x', 'json']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['y', 'x', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['y', 'x', 'json']) <Morsel: json='{'>
3.2.5 (default, Jul 7 2016, 11:07:15)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['y', 'x', 'json']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['y', 'x', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['y', 'x', 'json']) <Morsel: json='{'>
# ...loses 'y'?!
3.2.6 (default, Jul 7 2016, 11:09:00)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)]
Marius dict_keys(['x', 'json']) <Morsel: json='json.dumps({'>
Jonathan dict_keys(['y', 'x', 'json']) <Morsel: json='{"myVal":1}'>
Bernhard dict_keys(['x', 'json']) <Morsel: json='{'>
此行为与具有相同错误修复的 3.3.6 不同!事实上,它将 cookie 中 json
的值设置为 '{'
,丢弃该值的其余部分和 y
.
我的结论是:
- 我的版本适用范围更广;
- Marius 的版本实际上对 OP 没有帮助,因为它与原始版本具有相同的密钥;和
- 3.2 和 3.3 中的此功能发生了一些奇怪的事情!
这包括 'json'
作为 Python 3.3.2 及更早版本中的键:
>>> import json
>>> from http.cookies import SimpleCookie
>>> cookie = SimpleCookie('x=1; json=json.dumps({"myVal":1}); y=2')
>>> cookie.keys()
dict_keys(['y', 'x', 'json'])
然而,该值可能与预期的不同:
>>> print(cookie)
Set-Cookie: json=json.dumps({
Set-Cookie: x=1
Set-Cookie: y=2