Flask: обработка разных URL одной функцией

Обработка различных 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.

Что будем искать? Например,программа