Ваш подход к созданию HTML-сущностей в ваших представлениях и последующей передаче их в ваши шаблоны - это анти-паттерн Flask / Jinja.
Что это значит, вам нужно разделить логику между вашим бэкэндом (вашими представлениями) иваши визуализированные шаблоны (часть Jinja).
Вот почему, когда вы применяете фильтр safe
в своем шаблоне, вы в конечном итоге скажете Jinja Just show me this string as HTML and don't process it
. Таким образом, ваши сущности, которые содержат переменные и методы Jinja, плохо прорисованы.
Итак, простое решение вашей проблемы - передать только список изображений, которые вы хотите отрендерить, и выполнить логику шаблона в самом шаблоне. .
Вот рабочий пример:
app.py:
from flask import Flask, render_template
from flask.views import MethodView
application = Flask(__name__)
class IndexView(MethodView):
def get(self):
filenames = ['file1.jpg', 'file2.jpg']
return render_template('index.html', filenames=filenames)
application.add_url_rule('/', view_func=IndexView.as_view('index'))
if __name__ == '__main__':
application.run(debug=True)
index.html:
<html>
<body>
{% for filename in filenames %}
<img src="{{url_for('static', filename=filename)}}" />
{% endfor %}
</body>
<html>
И когда вы загрузите веб-сайт приложения, у вас будет этот HTML-блок:
<html>
<body>
<img src="/static/file1.jpg" />
<img src="/static/file2.jpg" />
</body>
<html>