为什么Flask在json模块中检查json.dumps('/')`中的''\\ /'?

时间:2015-08-07 17:06:59

标签: python flask

The source for the flask.json module contains the following line. '\\/'是什么意思,为什么Flask会检查这个?

_slash_escape = '\\/' not in _json.dumps('/')

2 个答案:

答案 0 :(得分:8)

Flask正在使用它来测试它是否使用转义斜杠的JSON库,当它不必时。如果库有,那么json.dump('/')将生成'"\\/"'(相当于原始字符串r'"\/"',请参阅here for an explanation on escape characters)。

Flask可以选择多个JSON库中的一个,而某些库/版本可以使用正斜杠,而其他库则不会。 Flask includes a comment explaining this.

如果库确实使用斜杠Flask will undo this when it dumps the JSON,则表示库之间的一致性。

# figure out if simplejson escapes slashes.  This behavior was changed
# from one version to another without reason.
_slash_escape = '\\/' not in _json.dumps('/')
...
def htmlsafe_dumps(obj, **kwargs):
    ...
    if not _slash_escape:
        rv = rv.replace('\\/', '/')
    ...
在HTML中呈现JSON时,

Flask still escapes unsafe HTML characters,因此可能不安全的字符串"</script>"变为"\\u003c/script\\u003e",这是安全的。

答案 1 :(得分:5)

反斜杠(\)是转义字符。在几种编程语言中,它意味着将下一个字符视为文字,而不是让它执行其正常功能(例如:放置文字引用而不是将其视为结束引用)。

两个反斜杠(\\)表示字面反斜杠。如同,不执行转义功能。

因此,JSON中的转义斜杠为\/,但要检测Python必须使用\\/将反斜杠视为转义。

顺便说一句,这就是为什么Python提供所谓的"raw string literals"前缀为r''的原因,因此您不必编写\\来获得字面反斜杠。

感谢davidism发现Flask在我可以做之前这样做的具体原因。请参阅this answer更详细地解释。