macros - Flask-WTF,使用宏使用 {{ field |safe}} 的意外输出(HTML 转义)
问题描述
请一些人解释我为什么会这样?{{ field |safe}} 的作用是什么?
我的 App.py 代码 -
class ContactForm(FlaskForm):
name = StringField("Name Of Student",validators = [InputRequired(message
= 'Name is missing'),Length(min=5,max=10,message="wrong")])
email = StringField("email",[validators.Email("Please enter your email
address.")])
@app.route('/form', methods = ['GET','POST'])
def index():
form = ContactForm()
if form.validate_on_submit():
return render_template('macro_output.html',form=form)
return render_template('main_form.html',form=form)
macro_form.html
{% macro render_output(field) %}
<p>
{{ field.label}}
{{ field |safe}}
</p>
{% endmacro %}
宏输出.html
{% from "macro_form.html" import render_field,
render_ErrorMessage,render_output %}
<html>
<body>
{{ render_output(form.name)}}
{{ render_output(form.name.data)}}
{{ render_output(form.email)}}
{{ render_output(form.email.data)}}
</body>
</html>
解决方案
jijna2 过滤器safe
将字符串视为安全的,并且不会通过自动转义任何否则会被解释为代码(在本例中为 HTML 代码)的字符来进行任何预格式化。
因此,如果一个变量,比如说,form.name.data = <html>
调用{{ form.name.data | safe }}
会将一个 html 标记 ( <html>
) 嵌入到您的 HTML 中,并且我希望 HTML 浏览器解析器简单地将其作为错误忽略(您可以检查呈现的页面源)。但是调用{{ form.name.data }}
jinja2 会转义 '<>' 字符,只有 'html' 会进入 HTML 并因此呈现为文本。
我强烈建议不要对用户输入使用安全过滤器,因为任意用户可以将代码注入您的页面,例如<script> ... </script>