转义
转义的概念是,在模板渲染字符串的时候,字符串有可能包括一些非常危险的字符比如<
、>
等,这些字符会破坏掉原来HTML
标签的结构,更严重的可能会发生XSS
跨域脚本攻击,因此如果碰到<
、>
这些字符的时候,应该转义成HTML
能正确表示这些字符的写法,比如>
在HTML
中应该用<
来表示等。
但是Flask
中默认没有开启全局自动转义,针对那些以.html
、.htm
、.xml
和.xhtml
结尾的文件,如果采用render_template
函数进行渲染的,则会开启自动转义。并且当用render_template_string
函数的时候,会将所有的字符串进行转义后再渲染。而对于Jinja2
默认没有开启全局自动转义,作者有自己的原因:
- 渲染到模板中的字符串并不是所有都是危险的,大部分还是没有问题的,如果开启自动转义,那么将会带来大量的不必要的开销。
-
Jinja2
很难获取当前的字符串是否已经被转义过了,因此如果开启自动转义,将对一些已经被转义过的字符串发生二次转义,在渲染后会破坏原来的字符串。
在没有开启自动转义的模式下(比如以.conf
结尾的文件),对于一些不信任的字符串,可以通过{{ content_html|e }}
或者是{{ content_html|escape }}
的方式进行转义。在开启了自动转义的模式下,如果想关闭自动转义,可以通过{{ content_html|safe }}
的方式关闭自动转义。而{%autoescape true/false%}...{%endautoescape%}
可以将一段代码块放在中间,来关闭或开启自动转义,例如以下代码关闭了自动转义:
{% autoescape false %}
<p>autoescaping is disabled here
<p>{{ will_not_be_escaped }}
{% endautoescape %}
如果想深入学习Flask,可以观看这套免费Flask教学视频:Flask入门到项目实战
</article>
版权声明: https://blog.csdn.net/huangyong1314/article/details/80391805
网友评论