
Jinja2 расширяема, и многие возможности (например, интернационализация и управление циклами) реализованы именно как расширения. Однако, документация по написанию расширений, как мне кажется, несколько неполна;
Что обычно советуют, чтобы изучить какой-либо фреймворк? Правильно, написать свой маленький простой чат. А мы сделаем это на Flask. Получилось всего 43 строчки!
Так как мы будем использовать шаблонизатор Jinja, чтобы отображать сообщения из базы данных, нам понадобятся 2 формы: одна для вставки сообщений, а другая, для их множественного отображения:
Ну и добавим совсем немножко CSS, чтобы вставить табуляцию:
И вот что у нас вышло:
Если кому интресно, весь проект можно глянуть на Github. :D
Каждый раз, когда я разговариваю с программистом о новом фреймворке или языке, он всегда советует мне написать простой чат. Но мы пойдем немного дальше и напишем очередного убийцу Twitter примитивный микроблог.
А будем мы использовать Flask и Jinja. Второе - это очень удобный шаблонизатор для Python, он нам понадобится, чтобы заполнять динамическими данными страничку HTML. Ну, сейчас разберемся.
Все наши посты будем хранить в SQLite, он прост и удобен, поэтому заранее заготовим схему базы данных:
Напишем обработчик запросов, серверную часть:
А вот здесь уже начинается самое интересное. Мы можем использовать Jinja, чтобы написать единую шапку для всех последующих страниц (как в ВК), чтобы она не повторялась в коде остальных страничек:
А вот и сама страничка, которая отображает посты:
Ну и чтобы это выгля
Понадобилось мне тут создать флаг в цикле, который можно использовать где нибудь потом в шаблоне. По логике все должно выглядеть примерно так:
{% set exists = 0 %} {% for i in range(5) %} {% if True %} {% set exists = 1 %} {% endif %} {% endfor %} {% if exists %} -->--> {% endif %}Но такой код не фурычит! exist всегда будет 0. Это особенность области видимости переменных в Jinja при присваивании.
{% set exists = [] %} {% for i in range(5) %} {% if True %} {% do exists.append(1) %} {% endif %} {% endfor %} {% if exists %} -->--> {% endif %}Решение взято от сюда
Иногда в шаблоне нужно зафигачить какую-нибудь рыбу типа "Lorem ipsum dolor sit amet", часто в цикле итд. Для этого существует функция lipsum()
Вот пример:
{% for x in range(5) %} {{ lipsum()|truncate(150)|safe }}И результат:
{% endfor %}
Justo aliquam faucibus lacus pulvinar commodo nisl, quisque est fusce venenatis mattis magnis arcu, hac felis parturient suspendisse a. Vitae ...
Porta tellus turpis leo suspendisse rutrum metus blandit, montes dis lacinia felis non, vehicula vivamus condimentum luctus massa, vehicula ...
Convallis molestie blandit viverra imperdiet eros dolor nam, ridiculus tortor duis blandit duis enim, cursus bibendum lobortis faucibus dui ...
Diam placerat risus porta litora consequat vel, accumsan tempus ligula laoreet a mollis rutrum, aptent est tortor pulvinar senectus, litora etiam. ...
Cursus non morbi non proin, porttitor
pcreate -t pyramid_jinja2_starter yoyoyoyoЕсли лень устанавливать пример, то нужно сделать следующее:
[python: **.py] [jinja2: **.jinja2] encoding = utf-8Добавить в setup.cfg
[extract_messages] add_comments = TRANSLATORS: output_file = myprojectname/locale/pyramid_promosite.pot width = 80 mapping_file = message-extraction.ini
package_data={'myproject': ['i18n/*/LC_MESSAGES/*.mo']}, message_extractors={'myproject': [ ('**.py', 'python', None), ('templates/**.html', 'jinja2', None), ('public/**', 'ignore', None)]},Добавьте в lib/base.py
from pylons.i18n.translation import _, ungettextИ что то типа того в config/environment.py
# Create the Jinja2 Environment config['pylons.app_globals'].jinja2_env = Environment(loade
В питоне пустые значения возвращаются как None. Поэтому в шаблонах Jinja вместо пустых значений отображаются None. Что бы поправить это нужно изменить метод finalize. Пример из google groups
def silent_none(value): if value is None: return '' return value from jinja2 import Environment env = Environment() env.finalize = silent_noneТеперь вместо None будет писаться пустая строка ''. В pylons нужно править файл environment.py
def silent_none(value): """ Jinja fix output None For more details: http://groups.google.com/group/pocoo-libs/browse_thread/thread/490f6e6e8fca6a6c """ if value is None: return '' return value def load_environment(global_conf, app_conf): """Configure the Pylons environment via the ``pylons.config`` object """ bla bla bla... # Create the Jinja2 Environment