Шаблонизатор Jinja2 в Python и Flask: циклы for, операторы if-else, фильтры, макросы
The author selected the Free and Open Source Fund to receive a donation as part of the Write for DOnations program.
Introduction
Flask is a lightweight Python web framework that provides useful tools and features for creating web applications in the Python Language.
When developing a web application, it is important to separate business logic from presentation logic. Business logic is what handles user requests and talks to the database to build an appropriate response.
Presentation logic is how the data is presented to the user, typically using HTML files to build the basic structure of the response web page, and CSS styles to style HTML components.
For example, in a social media application, you might have a username field and a password field that can be displayed only when the user is not logged in. If the user is logged in, you display a logout button instead. This is the presentation logic.
If a user types in their username and password, you can use Flask to perform business logic: You extract the data (the username and password) from the request, log the user in if the credentials are correct or respond with an error message. How the error message is displayed will be handled by the presentation logic.
In Flask, you can use the Jinja templating language to render HTML templates. A template is a file that can contain both fixed and dynamic content.
When a user requests something from your application (such as an index page, or a login page), Jinja allows you to respond with an HTML template where you can use many features that are not available in standard HTML, such as variables, if statements, for loops, filters, and template inheritance.
These features allow you to efficiently write easy-to-maintain HTML pages. Jinja also automatically escapes HTML to prevent Cross-Site Scripting (XSS) attacks.
In this tutorial, you’ll build a small web application that renders several HTML files. You’ll use variables to pass data from the server to the templates. Template inheritance will help you avoid repetition. You’ll use logic in templates such as conditionals and loops, use filters to modify text, and use the Bootstrap toolkit to style your application.
Prerequisites
Step 1 — Rendering a Template and Using Variables
Make sure you have activated your environment and have Flask installed, and then you can start building your application. The first step is to display a message that greets visitors on the index page. You’ll use Flask’s render_template() helper function to serve an HTML template as the response. You will also see how to pass variables from your application side to your templates.
First, in your flask_app directory, open a file named app.py for editing. Use nano or your favorite text editor:
Add the following code inside the app.py file:
flask_app/app.py
from flask import Flask, render_template app = Flask(__name__) @app.route('/')
def hello(): return render_template('index.html')
Save and close the file.
In this code block, you import the Flask class and the render_template() function from the flask package. You use the Flask class to create your Flask application instance named app.
Then you define a view function (which is a Python function that returns an HTTP response) called hello() using the app.route() decorator, which converts a regular function into a view function.
This view function uses the render_template() function to render a template file called index.html.
Next, you’ll have to create the index.html template file in a directory called templates inside your flask_app directory. Flask looks for templates in the templates directory, which is called templates, so the name is important. Make sure you’re inside the flask_app directory and run the following command to create the templates directory:
Next, open a file called index.html inside the templates directory for editing. The name index.html here is not a standard required name; you can call it home.html or homepage.html or anything else if you want:
- nano templates/index.html
Add the following HTML code inside the index.html file:
flask_app/templates/index.html
DOCTYPE html>
FlaskApp
Hello World! Welcome to FlaskApp!
Here, you set a title, added a Hello World! message as an H1 heading, and created a Welcome to FlaskApp! message as an H2 heading.
Save and close the file.
While in your flask_app directory with your virtual environment activated, tell Flask about the application (app.py in your case) using the FLASK_APP environment variable, and set the FLASK_ENV environment variable to development to run the application in development mode and get access to the debugger. Use the following commands to do this (on Windows, use set instead of export):
- export FLASK_APP=app
- export FLASK_ENV=development
Then, run the application using the flask run command:
With the development server running, visit the following URL using your browser:
http://127.0.0.1:5000/
You’ll see the title of the page is set to FlaskApp, and the two headings are rendered HTML.
In web applications, you often need to pass data from your application’s Python files to your HTML templates. To demonstrate how to do this in this application, you will pass a variable containing the current UTC date and time to the index template, and you’ll display the value of the variable in the template.
Leave the server running, and open your app.py file for editing in a new terminal:
Import the datetime module from the Python standard library and edit the index() function so the file looks as follows:
flask_app/app.py
import datetime
from flask import Flask, render_template app = Flask(__name__) @app.route('/')
def hello(): return render_template('index.html', utc_dt=datetime.datetime.utcnow())
Save and close the file.
Here you imported the datetime module and passed a variable called utc_dt to the index.html template with the value of datetime.datetime.utcnow(), which is the current UTC date and time.
Next, to display the variable’s value on the index page, open the index.html file for editing:
- nano templates/index.html
Edit the file to look as follows:
flask_app/templates/index.html
Hello World!
Welcome to FlaskApp!
{{ utc_dt }}
Save and close the file.
You added an H3 heading with the special {{ … }} delimiter to print the value of the utc_dt variable.
Open your browser and visit the index page:
http://127.0.0.1:5000/
You’ll see a page similar to the following image:
You’ve now created an index page with an HTML template in your Flask application, rendered a template, and passed and displayed a variable value. Next you’ll avoid code repetition by using template inheritance.
Step 2 — Using Template Inheritance
In this step, you’ll make a base template with content that can be shared with your other templates. You’ll edit your index template to inherit from the base template. Then, you’ll make a new page that will serve as your application’s About page, where users can find more information about your application.
A base template contains HTML components that are typically shared between all other templates, such as the application’s title, navigation bars, and footers.
First, open a new file called base.html for editing inside your templates directory:
Write the following code inside your base.html file:
flask_app/templates/base.html
DOCTYPE html>
{% block title %} {% endblock %} — FlaskApp nav a { color: #d64161; font-size: 3em; margin-left: 50px; text-decoration: none; }
FlaskApp About {% block content %} {% endblock %}
Save and close the file.
Most of the code in this file is standard HTML, a title, some styling for the navigation links, a navigation bar with two links, one for the index page and one for the About page not yet created, and a for the page’s content. (The links don’t work yet; the next step will demonstrate how to link between pages).
However, the following highlighted parts are specific to the Jinja template engine:
-
{% block title %} {% endblock %}: A block that serves as a placeholder for a title. You’ll later use it in other templates to provide a custom title for each page in your application without rewriting the entire FlaskApp
- Comments
- About
{% block content %} {% endblock %}
Most of the code above is Bootstrap boilerplate required to use it.
You have some meta tags, a link to the Bootstrap CSS file in the section, and at the bottom you have a link to optional JavaScript. The highlighted parts of the code contain Jinja code explained in the previous steps. Notice how you use specific tags and CSS classes to tell Bootstrap how to display each element.
In the tag above, you have an tag with the class navbar-brand, which determines the brand link in the navigation bar. Inside the
- tag, you have regular navigation bar items inside an tag in an
- tag.
- To learn more about these tags and CSS classes, see the Bootstrap components.
- Save and close the file.
- With the development server running, open the index page with your browser:
http://127.0.0.1:5000/
You’ll see a page similar to the following:
You can now use Bootstrap components to style items in your Flask application in all of your templates.Conclusion
You now know how to use HTML templates in your Flask web application. You’ve used variables to pass data from the server to templates, employed template inheritance to avoid repetition, incorporated elements such as if conditionals and for loops, and linked between different pages. You learned about filters to modify text and display trusted HTML, and you integrated Bootstrap into your application.
Экранирование и блоки raw, for, if
Смотреть материал на видео
Продолжаем изучение модуля Jinja и вначале рассмотрим способы экранирования данных в строках. О чем здесь речь? Давайте представим, что мы бы хотели фрагмент шаблона никак не преобразовывать и выводить так, как он записан. Например, вот такую строку:
from jinja2 import Template
data = '''Модуль Jinja вместо
определения {{ name }}
подставляет соответствующее значение'''
tm = Template(data)
msg = tm.render(name='Федор')
print(msg)- Если выполнить эту программу, то на выходе получим строку:
- Модуль Jinja вместо определения Федор
- подставляет соответствующее значение
Как вы понимаете, это не то, что мы бы хотели видеть. Нам нужно оставить эти фигурные скобки так, как они записаны без обработки. Как раз для этого используется специальное определение:
{% raw %} … {% endraw %}
И все записанное внутри этого блока не подвергается преобразованию модулем Jinja. То есть, если в строке data прописать этот блок:
data = '''{% raw %}Модуль Jinja вместо
определения {{ name }}
подставляет соответствующее значение{% endraw %}'''То на выходе будет именно этот текст без каких-либо подстановок. Вот так работает блок raw.
Экранирование символов
Далее, при работе с текстовыми HTML-шаблонами часто возникает необходимость экранирования некоторых символов, которые браузерами воспринимаются как определение тегов. Например, вот такая программа:
link = '''В HTML-документе ссылки определяются так: Ссылка'''
tm = Template(«{{ link }}»)
msg = tm.render(link = link)
print(msg)- На выходе дает строку:
- В HTML-документе ссылки определяются так:
- Ссылка
- И если, затем ее вывести как фрагмент HTML-документа, то мы увидим в окне браузера:
- А хотелось бы увидеть именно определение тега вместо самой ссылки. Для этого внутри фигурных скобок можно прописывать различные флаги и один из них
- e – escape (экранирование)
- Применить его можно так:
tm = Template(«{{ link | e }}»)
- Теперь, на выходе имеем:
- В HTML-документе ссылки определяются так:
- <a href="#">Ссылка</a>
- Смотрите, здесь вместо угловых скобок и кавычек прописаны специальные символы, которые браузером будут восприниматься как текстовый фрагмент и отображаться в виде:
И это именно то, что мы бы хотели получить в данном случае. Подобное преобразование довольно часто требуется выполнять при работе с шаблонами страниц сайтов, поэтому в модуле Jinja существует специальный класс escape, который на выходе выдает строку с экранированными символами:
from jinja2 import Template, escape
link = '''В HTML-документе ссылки определяются так: Ссылка'''
print(escape(link))Мы здесь уже не используем функционал шаблона, а просто преобразуем строку. Поэтому, для целей простого экранирования, лучше использовать этот метод, т.к. он работает быстрее, нежели через шаблон. Вот так работает экранирование в модуле Jinja.
Выражение for
- Следующий вид блока, который мы рассмотрим – это
- {% for -%}
- {% endfor %}
- Он позволяет формировать список на основе любого итерируемого объекта, например, упорядоченного списка. В качестве примера я приведу такую программу:
cities = [{'id': 1, 'city': 'Москва'},
{'id': 5, 'city': 'Тверь'},
{'id': 7, 'city': 'Минск'},
{'id': 8, 'city': 'Смоленск'},
{'id': 11, 'city': 'Калуга'}]
link = '''
{% for c in cities %}
{{c['city']}}
{% endfor %}
'''
tm = Template(link)
msg = tm.render(cities = cities)
print(msg)У нас здесь имеется список из городов и их id (например, в соответствии с rowid БД SQLite) и, затем, формируется тег select для HTML-документа. Внутри размещаются теги option по указанному формату для каждого города. В результате выполнения такого шаблона, получим следующее:
- Москва Тверь
- …
Мы здесь видим лишний перенос строки между тегами. Это из-за того, что после блока for стоит перенос строки. Убрать его можно двумя способами. Или записать вот в таком виде:
link = '''
{% for c in cities %}{{c['city']}}{% endfor %}
'''Или, поставить знак минус перед закрывающей скобкой:
link = '''
{% for c in cities -%}
{{c['city']}}
{% endfor -%}
'''Этот минус указывает удалять все переносы и пробелы после блока for и после endfor. Его можно ставить и вначале, тогда будут удалены пробелы и переносы справа от скобки.
Выражение if
- Последний тип блока, который мы рассмотрим на этом занятии – это блок для проверки условий. В самом простом варианте он записывается в виде:
- {% if %}
- {% endif %}
- И в нашем примере его можно использовать так:
link = '''
{% for c in cities -%}
{% if c.id > 6 -%}
{{c['city']}}
{% endif -%}
{% endfor -%}
'''- Мы здесь добавили проверку, что добавлять следует только те города, у которых id больше 6.
- Соответственно, здесь можно добавлять определение else:
link = '''
{% for c in cities -%}
{% if c.id > 6 -%}
{{c['city']}}
{%else -%}
{{c['city']}}
{% endif -%}
{% endfor -%}
'''И elif:
link = '''
{% for c in cities -%}
{% if c.id > 6 -%}
{{c['city']}}
{%elif c.city == «Москва» -%}
{{c['city']}}
{%else -%}
{{c['city']}}
{% endif -%}
{% endfor -%}
'''То есть, этот блок используется ровно так как и оператор if в Python.
Template Designer Documentation¶
This document describes the syntax and semantics of the template engine and
will be most useful as reference to those creating Jinja templates. As the
template engine is very flexible, the configuration from the application can
be slightly different from the code presented here in terms of delimiters and
behavior of undefined values.A Jinja template is simply a text file. Jinja can generate any text-based
format (HTML, XML, CSV, LaTeX, etc.). A Jinja template doesn’t need to have a
specific extension: .html, .xml, or any other extension is just fine.A template contains variables and/or expressions, which get replaced
with values when a template is rendered; and tags, which control the
logic of the template. The template syntax is heavily inspired by Django and
Python.Below is a minimal template that illustrates a few basics using the default
Jinja configuration. We will cover the details later in this document:My Webpage
{% for item in navigation %} {{ item.caption }} {% endfor %} My Webpage {{ a_variable }} {# a comment #}
The following example shows the default configuration settings. An application
developer can change the syntax configuration from {% foo %} to , or something similar.There are a few kinds of delimiters. The default Jinja delimiters are
configured as follows:Template variables are defined by the context dictionary passed to the
template.You can mess around with the variables in templates provided they are passed in
by the application. Variables may have attributes or elements on them you can
access too. What attributes a variable has depends heavily on the application
providing that variable.You can use a dot (.) to access attributes of a variable in addition
to the standard Python __getitem__ “subscript” syntax ([]).The following lines do the same thing:
{{ foo.bar }}
{{ foo['bar'] }}It’s important to know that the outer double-curly braces are not part of the
variable, but the print statement. If you access variables inside tags don’t
put the braces around them.If a variable or attribute does not exist, you will get back an undefined
value. What you can do with that kind of value depends on the application
configuration: the default behavior is to evaluate to an empty string if
printed or iterated over, and to fail for every other operation.Variables can be modified by filters. Filters are separated from the
variable by a pipe symbol (|) and may have optional arguments in
parentheses. Multiple filters can be chained. The output of one filter is
applied to the next.For example, {{ name|striptags|title }} will remove all HTML Tags from
variable name and title-case the output (title(striptags(name))).Условия и циклы в Jinja2: if, else и for
«Перед прочтением этой статьи советуем ознакомиться с тем, что такое Jinja. Это можно сделать в предыдущей нашей статье.
В предыдущей статье вы узнали как подставлять переменные в шаблон. Мы создали 6 переменных и подставили их в три карточки:
rendered_page = template.render( cap1_title=»Красная кепка», cap1_text=»$ 100.00″, cap2_title=»Чёрная кепка», cap2_text=»$ 120.00″, cap3_title=»Ещё одна чёрная кепка», cap3_text=»$ 90.00″,
)Эта схема совершенно не расширяемая: а что, если товаров в магазине будет 12? Создавать 24 переменные? Нет, вместо этого можно создать список из объектов и пройти его в цикле прямо внутри HTML-шаблона.
В этой статье мы рассмотрим if и for в шаблонах Jinja.
Цикл for
Начнём с вывода 6 карточек одной и той же кепки. У каждой карточки есть свой блок вёрстки. Как его найти можно прочитать здесь.
Мы его нашли, вот он:
…
New York Yankees Красная кепка NY Yankees за 20$ снова в продаже! Last updated 3 mins ago…
Далее хочется её продублировать 6 раз. Для этого в Jinja есть range(), такой же, как в Python:
…
{% for index in range(6) %} New York Yankees Красная кепка NY Yankees за 20$ снова в продаже! Last updated 3 mins ago
{% endfor %}
…Итак, мы просто добавили {% for index in range(6) %} сверху и {% endfor %} снизу. В целом, это тот же for из Python, просто он заключён в значки {% %} и в конце указывается {% endfor %}. После запуска main.py появится index.html с таким результатом:
Итерация по списку
6 одинаковых карточек — это не интересно. Карточки можно сделать разными, если названия кепок и их цены брать из списка. Добавим в main.py список из словарей с данными о кепках:
caps = [ { «title»: «Красная кепка», «price»: «$ 100.00», «image»: «https://dvmn.org/filer/canonical/1569333143/329/» }, …
]Полную верию данных можно найти здесь
Теперь вы можете передать в шаблон сразу список словарей:
rendered_page = template.render(caps=caps)
В шаблоне можно написать цикл по списку caps:
{% for cap in caps %} {{cap.title}} {{cap.price}} Last updated 3 mins ago
{% endfor %}Обратите внимание: к элементам словаря доступ идёт через точку: {{cap.image}}. В остальном, это почти такой же цикл, как и с range. После запуска main.py получается такой результат:
Условия if
Предположим, что у некоторых товаров ещё нет картинки. Что же делать? Без неё, на странице будет уродливая ошибка:
В такой ситуации поможет if. Давайте, если картинки нет, заменять её на “стандартную” картинку. Делается это очень просто:
{% if cap.image %}
{% else %}
{% endif %}Условия в Jinja2 работают так же, как и в Python. Если картинка есть, сработает тот блок, что выше, а если нет — тот, что ниже. Получится такой результат:
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
Flask Tutorial: Templates
Templates help you reuse visuals. In all web apps, the visuals are reused. This helps you divide the business and presentation logic. You don’t want your app code mixed with graphical design code.
Imagine an analytics app. You’d want the same navigation and footer on every page. The contents may differ, but the general design stays the same. That’s done with templates.
Related course: Python Flask: Create Web Apps with Flask
template example
The first thing you want to do is create a directory for your templates. You can do this from the terminal with the command below. If you haven’t done so, create an app. Assuming your project directory is named ‘app’,
(venv) $ mkdir app/templates A single template is just a file. Each template contains HTML code, this is the standard language for the web.
flask template variable
Lets create the file index.html
{{ title }} Hello {{ username }} Most of it are HTML tags (between the < and > symbols), which is standard on the web.
So what are those {{ and }} symbols?
This is how you can show Python variables on a webpage. They are placeholders for variables to be shown.
In this template there are two variables that can be passed, title and username.
template render
One of the key things to know is, templates are used to separate bussiness logic from presentation logic. This increases maintainability, extensionability and portability of your software.
Varibles can be passed from your Python code. Python needs to render templates, so import the module for that.
from flask import render_template Change the original code:
def index(): return 'Web App with Python Flask!' Into one that renders the template and passes variables:
def index(): name = 'Rosalia' return render_template('index.html', title='Welcome', username=name) Then start the app:
It will then show some text in the terminal:
* Serving Flask app «app» (lazy loading)* Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Debug mode: off* Running on http://0.0.0.0:81/ (Press CTRL+C to quit) And open the url shown in the terminal in your web browser.
render_template
In the above example, you called the function render_template(). Why call this method and not return html data immediately?
Flask is bundled with a language named Jinja2. This gives you the power to include variables, create loops and add if statements right in the template.
Primer on Jinja Templating – Real Python
Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Jinja Templating
Templates are an essential ingredient in full-stack web development.
With Jinja, you can build rich templates that power the front end of your Python web applications.But you don’t need to use a web framework to experience the capabilities of Jinja.
When you want to create text files with programmatic content, Jinja can help you out.In this tutorial, you’ll learn how to:
- Install the Jinja template engine
- Create your first Jinja template
- Render a Jinja template in Flask
- Use for loops and conditional statements with Jinja
- Nest Jinja templates
- Modify variables in Jinja with filters
- Use macros to add functionality to your front end
You’ll start by using Jinja on its own to cover the basics of Jinja templating.
Later you’ll build a basic Flask web project with two pages and a navigation bar to leverage the full potential of Jinja.Throughout the tutorial, you’ll build an example app that showcases some of Jinja’s wide range of features. To see what it’ll do, skip ahead to the final section.
You can also find the full source code of the web project by clicking on the link below:
This tutorial is for you if you want to learn more about the Jinja template language or if you’re getting started with Flask.
Jinja is not only a city in the Eastern Region of Uganda and a Japanese temple, but also a template engine.
You commonly use template engines for web templates that receive dynamic content from the back end and render it as a static page in the front end.But you can use Jinja without a web framework running in the background.
That’s exactly what you’ll do in this section.
Specifically, you’ll install Jinja and build your first templates.Before exploring any new package, it’s a good idea to create and activate a virtual environment.
That way, you’re installing any project dependencies in your project’s virtual environment instead of system-wide.Select your operating system below and use your platform-specific command to set up a virtual environment:
PS> python -m venv venv
PS> .venvScriptsactivate
(venv) PS>$ python3 -m venv venv
$ source venv/bin/activate
(venv) $With the above commands, you create and activate a virtual environment named venv by using Python’s built-in venv module.
The parentheses (()) surrounding venv in front of the prompt indicate that you’ve successfully activated the virtual environment.After you’ve created and activated your virtual environment, it’s time to install Jinja with pip:
(venv) $ python -m pip install Jinja2
Don’t forget the 2 at the end of the package name.
Otherwise, you’ll install an old version that isn’t compatible with Python 3.It’s worth noting that although the current major version is actually greater than 2, the package that you’ll install is nevertheless called Jinja2.
You can verify that you’ve installed a modern version of Jinja by running pip list:(venv) $ python -m pip list
Package Version
———- ——-
Jinja2 3.x
…To make things even more confusing, after installing Jinja with an uppercase J, you have to import it with a lowercase j in Python.
Try it out by opening the interactive Python interpreter and running the following commands:>>>>>> import Jinja2
Traceback (most recent call last):
…
ModuleNotFoundError: No module named 'Jinja2' >>> import jinja2
>>> # No errorWhen you try to import Jinja2, with the uppercase naming that you used to install Jinja, then you raise a ModuleNotFoundError.
To import the Jinja package to Python, you must type jinja2 with a lowercase j.With Jinja imported, you can go on to load and render your first template:
>>>>>> import jinja2
>>> environment = jinja2.Environment()
>>> template = environment.from_string(«Hello, {{ name }}!»)
>>> template.render(name=»World»)
'Hello, World!'The core component of Jinja is the Environment() class.
In this example, you create a Jinja environment without any arguments.
Later you’ll change the parameters of Environment to customize your environment.
Here, you’re creating a plain environment where you load the string «Hello, {{ name }}!» as a template.What you just did may not seem much more impressive than using a formatted string in plain Python.
However, this example shows two important steps that you usually perform when using Jinja:- Load a template: Load a source that contains placeholder variables. By default, they’re wrapped in a pair of curly brackets ({{ }}).
- Render the template: Fill the placeholders with content. You can provide a dictionary or keyword arguments as context. In this case, you’ve filled the placeholder so that you get the familiar Hello, World! as output.
The source template that you’re loading can be a literal string.
But things get way more interesting when you work with files and provide a text file as a template.If you want to follow along with the examples in this tutorial, then you can go ahead and create a new folder to work in.
Inside your working directory, create a folder named templates/.You’ll store any upcoming templates in the templates/ folder.
Now create a text file named message.txt:Jinja циклы — PythonCod — учим Пайтон
Давайте рассмотрим jinja циклы, а именно блок for, который позволяет фотмировать список на основе любого итерируемого объекта, например, списков. Вот здесь вы найдете все о списках, методы списков в Python, а также сможете проверить свои знания пройдя тест списки в Python.
Ну, а саму документацию вы найдете здесь: https://jinja.palletsprojects.com/en/2.11.x/
{% for -%}
{% endfor %}
Давайте рассмотрим пример, есть у нас некий список, элементами которого являются словари:
person = [{'id': 1, 'name': 'Олег'},
{'id': 2, 'name': 'Иван'},
{'id': 3, 'name': 'Анна'},
{'id': 4, 'name': 'Сергей'},
{'id': 5, 'name': 'Екатерина'}]Давайте отобразим эти элементы на странице:
from jinja2 import Template
link = '''
{% for p in person -%}
{{p['name']}}
{% endfor -%}
'''tm = Template(link)
msg = tm.render(person=person)print(msg)
В цикл мы передаем наш список person, в самом цикле получаем каждый элемент списка в переменной p, это все находится в многостроковом коментарии, что бы потом его переменную link передать в класс Template для создания объекта. После чего, эту строку передаем в класс Template, создав таким образом объект класса, и у него вызываем метод render, которому также передаем наш список person.
- Двойные фигурные скобки нам нужны для того, что внутрь их передать значение переменной: {{p[‘id’]}} – отображаем id с базы данных, {{p[‘name’]}} – отображаем имя.
- Вот где нам нужны jinja циклы – для отображения элементов списков контента на страницах сайта, и таким образом вы можете отображать абсолютно все итерируемые объекты, не только циклы, но и tuple, dictionary, и другие.
- На том же примере, person в блоке for:
link = '''
{% for p in person -%}
{% if p.id > 3 -%}
{{p['name']}}
{% endif -%}
{% endfor -%}
'''Внутрь цикла мы добавили блок if-else. Работает он точно также, как и в других частях пайтон-кода, единственное что, не забывает включать его в фигурные скобки {} и писать блок {% endif %}
Также, в блоке if конечно же можно исспользовать конструкцию else, выглядит это так:
link = '''
{% for p in person -%}
{% if p.id > 3 -%}
{{p['name']}}
{% else -%}
{{p['name']}}{% endif -%}
{% endfor -%}
'''Конечно же, блок {% else %} выполнится в том случае, если условие в if будет ложным.
Ну, и на последок скажем о блоке {% elif p.name == ‘Иван’ %}
from jinja2 import Template
person = [{'id': 1, 'name': 'Олег'},
{'id': 2, 'name': 'Иван'},
{'id': 3, 'name': 'Анна'},
{'id': 4, 'name': 'Сергей'},
{'id': 5, 'name': 'Екатерина'}]link = '''
{% for p in person -%}
{% if p.id > 3 -%}
{{p['name']}}
{% elif p.name == 'Иван' -%}
{{p['name']}}
{%- else -%}
{{p['name']}}
{% endif -%}
{% endfor -%}
'''tm = Template(link)
msg = tm.render(person=person)print(msg)
#Результат получим
#Олег
#ИванАнна
#Сергей
#ЕкатеринаИтак, подведем итог:
- Мы разобрали Jinja циклы, синтаксис их, и как с ними работать
- Также рассмотрели блоки if-elif-else в Jinja
Стоит помнить, что в цикл мы передаем только итерируемые объекты!
Записки программиста
Напомню, что у меня нет особого опыта веб-разработки на Python.
Но поскольку рабочая теория на данный момент заключается в том, что это самый правильный скриптовый язык, мне бывает очень интересно сесть и поиграться с каким-нибудь Flask. Или, вот как в этот раз — с Jinja.
В результате я написал небольшую шпаргалку по основам использования Jinja, чисто для себя. Уверен, вы уже давно владеете этим шаблонизатором в совершенстве, так что вам будет совершенно не интересно 🙂
Итак, коль скоро речь зашла о HTML, CSS и вот этом всем, не лишним будет упомянуть, как во Flask делается раздача статики:
@app.route('/static/', methods=['GET'])
def get_static(path):
return send_from_directory('static', path)Рендеринг же простейшего шаблона выглядит следующим образом:
@app.errorhandler(404)
def error_404(e):
data = flask.render_template('error.html', message = 'Not found!')
return (data, 404)… где содержимое templates/error.html:
Что-то пошло не так!
{{ message }}
Поскольку у сайтов обычно есть повторяющиеся хидеры и футеры, традиционно шаблон выглядит как-то так:
{% extends «layout.html» %}
{% block title %}Ошибка!{% endblock %}
{% block body %}Что-то пошло не так!
{{ message }}
{% endblock %}… где layout.html описывает шаблон страницы, в стиле:
{% block title %}{% endblock %}
{% block body %}{% endblock %}Иногда возникает необходимость использовать в шаблонах условные операторы:
{#
еще ключевые слова: elif, else
кстати, да, это — комментарий
#}
HomeSubmit
Более сложный пример, с определением макроса и циклом for:
{% macro render_themes(themes_list) %}
{% if themes_list == [] %}(None)
{% else %}
{% for theme in themes_list %}
{{ theme[«description»] }}
{% endfor %}
{% endif %}{% endmacro %}
Макрос вызывается очень просто:
{{ render_themes(current) }}
Если вы уверены, что выводимые данные правильно экранированы и все такое, и хотите отключить замену спецсимволов на HTML-тэги (например, замену на < и >), то можете сказать:
{{ encode_desc(description)|safe }}
Чтобы Jinja могла вызвать процедуру, написанную на Python, используйте код в стиле:
def encode_desc(desc):
# тут ваш кодapp.jinja_env.globals.update(encode_desc = encode_desc)
Как видите, все просто и понятно. Насколько я могу судить, приведенных в этом посте знаний должно хватить на все случаи жизни. Полную версию кода к посту вы найдете в этом репозитории на GitHub. Больше информации по Jinja — на официальном сайте.
Обратите также внимание на утилиту jinja2-cli, которую можно использовать, например, для генерации кода на каком-нибудь C. Еще из подобных проектов стоит обратить внимание на Cog.
Шаблонизатор Jinja: основы и секреты эффективной веб-разработки
Jinja – это шаблонизатор для языка Python, который значительно упрощает создание HTML-шаблонов и позволяет сэкономить время веб-разработчикам. Jinja используется во многих известных проектах, таких как Flask, Ansible, SaltStack и др.
Одна из главных причин, по которой веб-разработчики используют Jinja, заключается в его высокой производительности и удобной синтаксисе. Шаблоны Jinja могут содержать логику, включая условные выражения и циклы, и могут обрабатывать переменные.
В статье мы рассмотрим основы работы с Jinja, чтобы вы могли начать использовать его в своих проектах и повысить эффективность вашей веб-разработки.
Основы шаблонизатора Jinja
Шаблонизатор Jinja является одним из самых популярных инструментов, который используется в современной веб-разработке. Данный инструмент позволяет быстро и эффективно создавать динамические веб-страницы, которые могут быть адаптированы под различные устройства.
Функциональность шаблонизатора:
- вставка переменных;
- циклы;
- условия;
- фильтры;
- наследование;
- макросы;
- подключение шаблонов.
Одним из главных преимуществ Jinja является его простота и легкость в использовании. Он позволяет значительно ускорить процесс разработки и уменьшить количество ошибок.
Пример использования шаблонизатора: {% for i in range(1,11) %} Вывод списка чисел от 1 до 10: {{ i }} {% endfor %} Как видно из примера, использование Jinja значительно упрощает процесс создания динамических страниц на сайте. Богатый функционал и простота использования делают Jinja идеальным инструментом для веб-разработчиков.
Зачем использовать шаблонизатор?
Шаблонизатор – это инструмент, который позволяет разделять логику и содержимое веб-страницы. То есть, разработчик может создавать шаблоны, содержащие общую структуру веб-страницы, а затем заполнять эту структуру данными из базы данных или других источников информации.
Использование шаблонизатора существенно упрощает процесс веб-разработки, позволяет сэкономить время и повысить эффективность работы. Вместо того, чтобы каждый раз создавать веб-страницы с нуля, можно использовать готовые шаблоны и вставлять в них изменяемые элементы.
Кроме того, с помощью шаблонизатора можно легко изменять внешний вид и структуру веб-страницы, не затрагивая содержание, что очень удобно при разработке сайтов с большим количеством страниц. Также, использование шаблонизатора облегчает сопровождение проекта, так как изменения в структуре веб-страницы можно вносить в одном месте, а не в каждой странице отдельно.
В целом, использование шаблонизатора является необходимым для профессиональной веб-разработки и позволяет сократить время и усилия, затрачиваемые на создание и поддержку веб-сайтов.
Преимущества использования Jinja
Jinja – это шаблонизатор для языка программирования Python, который позволяет создавать более эффективный и чистый код, а также ускоряет процесс разработки веб-приложений.
Основными преимуществами использования Jinja являются:
- Разделение логики и представления – благодаря Jinja можно создавать удобно читаемые шаблоны и разделять эстетическую часть веб-страницы (представления) и программную часть (логику).
- Легкоизменяемые шаблоны – в Jinja очень просто изменять шаблоны, потому что они создаются с использованием простого языка Python. Это особенно полезно, когда необходимо изменить макет веб-страницы или добавить новые элементы.
- Автоматическая фильтрация данных – Jinja автоматически фильтрует все данные, подставляемые в шаблон, что защищает приложение от инъекций на стороне клиента.
- Поддержка множества функций и расширений – Jinja поддерживает расширения, которые позволяют добавлять новые возможности в шаблоны, такие как использование макросов, наследования, блоков, итерации и многое другое.
- Быстрая работа – благодаря использованию кеширования в Jinja, шаблоны и данные компилируются и сохраняются на сервере, что позволяет ускорить работу приложения и сделать его более эффективным.
Читать: Как повысить ноду в Docker и превратить контейнер в ноду
В целом, использование Jinja может помочь вам значительно ускорить процесс разработки веб-приложений и создать более эффективный и чистый код.
Как работает шаблонизатор Jinja
Шаблонизатор Jinja является мощным инструментом для веб-разработки, который позволяет с легкостью создавать динамические веб-страницы.
Основной принцип работы шаблонизатора Jinja – это использование шаблонов, содержащих определенные элементы, которые могут быть заменены на значения, получаемые в процессе выполнения приложения.
Для этого в шаблоне используются символы {{ }}, которые позволяют обозначить заменяемые элементы. Кроме того, для более гибкой работы с шаблонами, в Jinja реализована возможность использования условных операций (if-else), циклов, фильтров и множества других функций.
Важно отметить, что при использовании Jinja шаблоны могут быть настроены на работу с различными источниками данных, включая базы данных, файлы JSON или YAML, а также серверные переменные.
В целом, используя шаблонизатор Jinja, разработчики могут значительно сократить время и повысить эффективность работы над проектами веб-разработки, благодаря простоте и удобству его использования.
Создание шаблонов
Основной задачей шаблонов является удобное и быстрое создание макетов страниц для сайта. Для этого в Jinja используются специальные теги, такие как {% block %}, {% if %}, {% for %} и другие.
Важно помнить, что каждый шаблон должен иметь свою уникальную структуру, включая заголовки, подвалы, боковые панели и т.д. Все эти элементы могут быть реализованы с помощью тега {% block %}, который позволяет создавать базовый шаблон и затем наследовать его в других страницах.
Для более удобного и понятного создания шаблонов, Jinja предоставляет возможность использования переменных, условных операторов и циклов. Например, можно использовать {% if %} для проверки определенного значения переменной и в зависимости от этого выводить различные данные на странице.
Также, для создания таблиц и списков, можно использовать теги {% for %}, {% if %} и {% endif %}. Они помогают управлять порядком и содержанием отображаемых элементов и сэкономить время при ручном создании списка или таблицы.
В общем, использование шаблонов в Jinja позволяет значительно упростить и ускорить создание макетов для сайта и быстро адаптироваться к изменениям требований заказчика.
Использование переменных и операторов
Шаблонизатор Jinja позволяет использовать переменные в шаблонах, что упрощает написание кода и делает его более читаемым. Для использования переменных необходимо заключить их имя в двойные фигурные скобки: {{ variable_name }}.
Также можно использовать операторы в шаблонах, например, условный оператор if и цикл for. Для использования условного оператора необходимо написать его имя, далее условие в скобках и закрыть тэг endif. Например:
- {% if variable_name > 10 %}
- Переменная больше 10
- {% endif %}
- Для использования цикла for необходимо указать имя переменной, затем ключевое слово in и название списка или словаря. Пример:
- {% for item in list %}
- {{ item }}
- {% endfor %}
- Также можно использовать операторы математических и логических вычислений, например,
- {% if a == b or c % 2 == 0 %}
- {% endif %}
- Используя переменные и операторы в шаблонах, можно создать динамический и гибкий контент для сайта, который будет адаптироваться к различным условиям и данным.
- Шаблонизатор Jinja – удобный инструмент для создания динамических веб-страниц.
- Он может быть использован для организации вывода динамического контента, создания шаблонов запросов к БД, генерации документации и создания форм обратной связи, комментариев и др.
- Использование шаблонизатора Jinja поможет значительно сократить время на написание кода и повысить эффективность веб-разработки.
- loader: определяет путь к каталогу, в котором будут храниться шаблоны;
- autoescape: определяет, нужно ли автоматически экранировать выходные данные;
- extensions: определяет список расширений, которые необходимо подключить;
- environment: определяет глобальные переменные, которые будут доступны в шаблонах.
- После того, как файл настроек был создан, необходимо импортировать его в ваше приложение и произвести инициализацию шаблонизатора. Для этого можно воспользоваться следующим кодом:
- from jinja2 import Environment, FileSystemLoader
- env = Environment(loader=FileSystemLoader('/path/to/templates'))
- Например, если у вас есть шаблон “index.html” в папке “templates”, то вы можете включить его в Flask следующим образом:
- from flask import Flask, render_template
- app = Flask(__name__)
- @app.route(‘/’)
- def home():
- return render_template(‘index.html’)
Примеры использования Jinja
Шаблонизатор Jinja может быть использован в различных областях веб-разработки. Например, он может помочь в организации вывода динамического контента на веб-страницах.
В случае работы с базами данных, Jinja может использоваться для создания шаблонов запросов к БД. Для этого можно описать структуру таблицы в шаблоне и использовать ее при создании запросов, что позволяет значительно сократить время на написание каждого запроса вручную.
Также Jinja может быть применен для генерации документации. С помощью шаблонов можно создавать различные примеры кода и вставлять их в документацию, что поможет разработчикам быстрее разобраться в использовании функций и классов в приложении.
Еще одним примером использования Jinja является создание форм обратной связи или комментариев на веб-страницах. Вместо того, чтобы работать с каждой формой отдельно, можно создать шаблон для формы и вставлять его в нужном месте на странице, меняя только некоторые параметры, такие как заголовки и текстовые поля.
Генерация HTML-страниц и форм
Одной из основных задач веб-разработки является создание HTML-страниц и форм, которые пользователи смогут заполнять и отправлять. Для ускорения и упрощения этого процесса используется шаблонизатор Jinja.
С помощью Jinja можно генерировать HTML-код динамически, подставляя в него данные из базы данных или других источников. Например, можно создать шаблон страницы, который будет автоматически подставлять заголовок, текст и изображения в соответствующие места.
Также с помощью Jinja можно создавать формы для заполнения пользователем. Шаблон формы может содержать поля для ввода текста, выбора из списка, выбора файла и другие. Затем, при отправке формы, данные будут автоматически обработаны и сохранены.
Важно отметить, что использование шаблонизатора Jinja позволяет сократить время и улучшить эффективность веб-разработки, так как значительная часть кода генерируется автоматически. Кроме того, это позволяет создать более структурированный и понятный код, что полезно как для самого разработчика, так и для других людей, работающих с проектом.
Формирование отчетов и документов
Шаблонизатор Jinja позволяет быстро и эффективно формировать отчеты и документы любой сложности. Все данные, необходимые для отчета, можно легко получить из базы данных или другого источника.
Для удобства формирования отчетов можно использовать циклы и условные операторы. Также можно использовать фильтры для преобразования данных перед выводом на экран.
Для формирования таблиц можно использовать теги
. Все эти теги легко комбинируются с переменными и фильтрами, что позволяет формировать таблицы с любой структурой. Если необходимо вывести список данных, можно использовать теги Использование шаблонизатора Jinja позволяет не только эффективно формировать отчеты и документы, но и значительно сократить затраты времени на разработку. Благодаря этому разработчики могут сосредоточиться на других задачах и повысить общую эффективность работы. Интеграция Jinja в веб-приложенияJinja – это мощный шаблонизатор Python, который вводит удобный способ разделения кода и логики приложения. Использование Jinja в веб-разработке позволяет значительно упростить процесс создания динамических страниц. Установка и настройка шаблонизатораШаблонизатор Jinja – это мощный инструмент, который позволяет ускорить процесс веб-разработки и повысить ее эффективность. Для того, чтобы начать работать с этим инструментом, необходимо сначала установить его на свой компьютер. В качестве аргументов конструктора шаблонизатора передается объект класса FileSystemLoader, который определяет путь к каталогу, в котором будут храниться шаблоны. После этого можно начинать работу с шаблонизатором и создавать свои первые шаблоны в соответствии с требованиями вашего проекта. Использование Jinja совместно с фреймворкамиJinja – это шаблонизатор Python, который позволяет разделять логику и дизайн веб-приложения. Если вы используете фреймворки, такие как Flask, Django, Pyramid, Bottle, то Jinja может быть встроен непосредственно в приложение. Здесь мы используем функцию “render_template”, чтобы вернуть шаблон “index.html”. Если в вашем шаблоне есть переменные или другие динамические элементы, вы можете передать их через аргументы функции “render_template”. |