Jinja2 html представление в python 3 - PullRequest
1 голос
/ 20 февраля 2020

Я пишу блог с поддержкой flask и хочу представить свои комментарии, сохраненные в формате XML, в браузере, поэтому я открыл файл XML и прочитал его.

from xml.etree.ElementTree import parse

def blue():
with open('blogcomment.xml') as file:
    doc = parse(file)

return '\n'.join("""
        <div class="card">
            <span></span>
            <div class="content">
                <p class="date">%s</p>
                <h3></h3>
                <p class="desc">%s</p>
            </div>
        </div>
        """%(item.findtext('date'), item.findtext('body')) for item in doc.iterfind('entries/entry'))

Тогда я назвал синий

@sqldb.route('/dbresult')
def dbresult():
   f = blue()
   return f

# Вывод:

11/14/2007

в латиноамериканский, ad nam phaedrum mediocrem cotidieque.

11/18/2007

Я получил новый куб, который я заказал. Это настоящая жемчужина.

Это то, что я хотел, но я хочу, чтобы это было в определенном разделе моего блога, поэтому я создал

<!doctype html>
<html>

<head>
</head>

<body>
{{f}}


</body>

</html>

и изменил свой маршрут на

@sqldb.route('/dbresult')
def dbresult():
   f = blue()
   return render_template('dbresult.html', f=f)

когда я запускал код, который он выводил

<div class="card"> <span></span> <div class="content"> <p class="date">11/14/2007</p> <h3></h3> <p 
class="desc">in qui latine elaboraret, ad nam phaedrum mediocrem cotidieque.</p> </div> </div> <div 
class="card"> <span></span> <div class="content"> <p class="date">11/18/2007</p> <h3></h3> <p 
class="desc">Got the new cube I ordered. It’s a real pearl.</p> </div> </div> 

в браузере, так как браузер не интерпретировал HTML, это из Jinja2 или что я сделал неправильно, мне нужна помощь.

blogcomment. xml

   <?xml version="1.0"?>
   <blog>
    <entries>
        <entry>
            <date>11/14/2007</date>
            <name>Jeff</name>
            <body>in qui latine elaboraret, ad nam phaedrum mediocrem cotidieque.</body>
        </entry>

        <entry>
            <date>11/18/2007</date>
            <name>Petter</name>
            <body>Got the new cube I ordered. It&#x2019;s a real pearl.</body>
        </entry>

    </entries>
</blog>

1 Ответ

1 голос
/ 21 февраля 2020

Flask конфигурация по умолчанию включает автоэкранирование для .html шаблонов. Поэтому, когда вы помещаете {{ f }} в шаблон, переменная f обрабатывается как небезопасная переменная, и любой «опасный» символ (например, < или >) будет экранирован (преобразован в сущность HTML).

Чтобы предотвратить такое поведение, вы можете использовать безопасный шаблонный фильтр , который помечает переменную как безопасную, чтобы ее нельзя было экранировать:

<!doctype html>
<html>

<head>
</head>

<body>
{{ f | safe }}
</body>

</html>

Убедитесь, что f не содержит никакого вредоносного кода.

Лучшим подходом будет то, что в вашем методе blue вы просто подготавливаете данные для рендеринга (например, создаете список диктовок из данных), а затем визуализируете комментарии в файле шаблона с использованием встроенного управляющего оператора for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...