首页 > 解决方案 > 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>

标签: macrosoutputfieldflask-wtforms

解决方案


jijna2 过滤器safe将字符串视为安全的,并且不会通过自动转义任何否则会被解释为代码(在本例中为 HTML 代码)的字符来进行任何预格式化。

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

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


推荐阅读