Flask-WTF, неожиданный вывод при использовании макроса {{field | safe}} (экранирование HTML) - PullRequest
0 голосов
/ 27 августа 2018
  • Когда вход

    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 голосов
/ 27 августа 2018

Фильтр jijna2 safe рассматривает строки как безопасные и не выполняет предварительного форматирования, автоматически экранируя любые символы, которые в противном случае были бы интерпретированы как код (в данном случае HTML-код).

Так что, если переменная, скажем, form.name.data = <html>, то вызов {{ form.name.data | safe }} встроит HTML-тег (<html>) в ваш HTML, и я ожидаю, что парсер HTML-браузера просто проигнорирует это как ошибку (вы можете проверить отображаемую страницуисточник).Но при вызове {{ form.name.data }} jinja2 будут исключены символы «<>», «html» попадет в HTML и, следовательно, будет отображаться как текст.

Я бы настоятельно рекомендовал не использовать безопасный фильтр для пользовательского ввода., поскольку произвольный пользователь может внедрить код на вашу страницу, например, <script> ... </script>

...