Flask-WTF,使用{{field | safe}}的宏使用产生意外输出(HTML转义)

时间:2018-08-27 07:37:57

标签: macros output field flask-wtforms

  • 当输入为

    enter image description here

  • 此时输出为

    enter image description here

  • 但是当我将输入更改为

    enter image description here

  • 我的输出更改为

    enter image description here

请有人解释一下为什么会这样吗? {{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 %}

macro_output.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>

1 个答案:

答案 0 :(得分:0)

jijna2过滤器safe将字符串视为安全,并且不会通过自动转义任何原本会解释为代码的字符(在这种情况下为HTML代码)来进行任何预格式化。

因此,如果某个变量,例如form.name.data = <html>,然后调用{{ form.name.data | safe }},则会在您的HTML中嵌入一个html标签(<html>),并且我希望HTML浏览器解析器将其忽略为错误(您可以检查渲染的页面源)。但是调用{{ form.name.data }} jinja2将转义'<>'字符,只有'html'进入HTML并因此呈现为文本。

我强烈建议您不要在用户输入中使用安全过滤器,因为任意用户都可以将代码注入到您的网页中,例如<script> ... </script>