The source for the flask.json
module contains the following line. '\\/'
是什么意思,为什么Flask会检查这个?
_slash_escape = '\\/' not in _json.dumps('/')
答案 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更详细地解释。