Обработка различных URL-адресов
В предыдущем уроке мы научились обрабатывать отдельные страницы. Рассмотрим, как одной функцией обрабатывать несколько URL-адресов. Например, чтобы при переходе на главную страницу (/) и на /home отображался один и тот же контент.
Можно создать две отдельные функции, но это неэффективно. Для обработки нескольких URL-адресов одной функцией используем следующий подход:
@app.route("/", methods=['GET'])
@app.route("/home", methods=['GET'])
def index():
return "Hello, world!"
Добавляем декоратор @app.route("/home", methods=[‘GET’]), указывающий, что функция index также обрабатывает URL /home. Можно добавить столько маршрутов, сколько необходимо.
Получение параметров из URL-адреса
Рассмотрим URL вида /user/alex/56, где alex — имя пользователя, а 56 — его ID. Для извлечения параметров используем угловые скобки в декораторе @app.route:
@app.route("/user/<string:name>/<int:user_id>", methods=['GET'])
def user(name, user_id):
return f"User: {name}, ID: {user_id}"
string:name и int:user_id указывают тип данных параметров. Функция user принимает эти параметры и выводит их.
Создание и использование HTML-шаблонов
Создадим папку templates, в которой будут храниться HTML-шаблоны. Flask по умолчанию ищет шаблоны в этой папке. Создадим файлы index.html и about.html.
index.html:
<!DOCTYPE html>
<html>
<head>
<title>Fellow</title>
</head>
<body>
<h1>Привет мир</h1>
</body>
</html>
about.html:
<!DOCTYPE html>
<html>
<head>
<title>About</title>
</head>
<body>
<h1>Страница про нас</h1>
</body>
</html>
В app.py импортируем render_template:
from flask import Flask, render_template
# ...
@app.route("/")
def index():
return render_template("index.html")
@app.route("/about")
def about():
return render_template("about.html")
Функции возвращают результат render_template, указывая имя HTML-файла.
Наследование шаблонов и подключение стилей
Для сокращения повторяющегося кода используем наследование. Создадим базовый шаблон base.html:
<!DOCTYPE html>
<html>
<head>
<title>{{% block title %}}{{% endblock %}}</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
</head>
<body>
{{% block body %}}{{% endblock %}}
</body>
</html>
{{% block title %}}{{% endblock %}} и {{% block body %}}{{% endblock %}} — блоки для подстановки контента. Подключение стилей осуществляется напрямую в base.html.
В index.html и about.html наследуем base.html:
{% extends "base.html" %}
{% block title %}Главная страница{% endblock %}
{% block body %}
<h1>Основная страница сайта</h1>
{% endblock %}
{% extends "base.html" %}
{% block title %}Страница про нас{% endblock %}
{% block body %}
<h1>Страница про нас</h1>
{% endblock %}
Изменения в base.html автоматически применяются ко всем наследующим шаблонам.
Создадим папку static в корне проекта, внутри нее — папку css, и файл main.css:
body {
background-color: red;
}
В app.py импортируем url_for:
from flask import Flask, render_template, url_for
#...
Использование Bootstrap
Для быстрого создания красивого дизайна подключим Bootstrap, используя CDN:
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
Добавим в шаблоны элементы Bootstrap.
Мы научились создавать и использовать HTML-шаблоны в Flask, работать с параметрами URL, использовать наследование шаблонов и подключать стили, включая Bootstrap.