Как создать свою веб-страницу на Python: мини-приложение на Flask

Как создать свою веб-страницу на Python: мини-приложение на Flask Полезное

Веб-страница на Python — это HTML-страница, которую отдает ваша программа на Python: код принимает HTTP-запрос браузера по определенному адресу (маршруту) и возвращает в ответ готовый HTML. Сам Python при этом работает на стороне сервера (бэкенд), а разметку страницы браузер получает уже собранной.

Ниже — полный рабочий пример на микрофреймворке Flask: приложение из нескольких строк, отдельный HTML-шаблон, запуск локально и краткий разбор того, что нужно поменять перед публикацией в интернете. Пример проверен на Flask 3.1.3 и Python 3 (20.09.2026).

Что понадобится

Нужен установленный Python 3 и один пакет — Flask. Flask — это микрофреймворк: он берет на себя маршрутизацию и подстановку данных в шаблоны, но не навязывает структуру проекта. Для одной страницы этого достаточно.

Django — более крупный фреймворк с ORM, админкой и своей структурой проекта; он оправдан на большом сайте, но для первой страницы дает лишний объем. Здесь берем Flask как самый короткий путь до видимого результата.

Установка в отдельное виртуальное окружение (изолирует зависимости проекта от системного Python):

python3 -m venv venv
source venv/bin/activate
pip install flask

На Windows активация окружения выглядит иначе: venv\Scripts\activate. Проверить версию можно командой pip show flask.

Минимальный пример целиком

Соберем проект из двух файлов. Структура папки:

mysite/
    app.py
    templates/
        index.html

Файл app.py — это само приложение. Он создает объект Flask, описывает один маршрут / и возвращает по нему собранную страницу:

from flask import Flask, render_template

app = Flask(__name__)


@app.route("/")
def index():
    return render_template("index.html", title="Моя страница", name="Мир")


if __name__ == "__main__":
    app.run(debug=True)

Файл templates/index.html — это шаблон страницы. Двойные фигурные скобки {{ }} — места, куда Flask подставит переданные из Python значения:

<!doctype html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>{{ title }}</title>
</head>
<body>
    <h1>Привет, {{ name }}!</h1>
    <p>Это моя первая страница на Python и Flask.</p>
</body>
</html>

Запуск из папки mysite (окружение активировано):

python app.py

В консоли появится примерно такой вывод (адрес и порт — ключевая строка):

 * Serving Flask app 'app'
 * Debug mode: on
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit

Откройте в браузере адрес http://127.0.0.1:5000/ — страница покажет заголовок «Привет, Мир!» и абзац ниже. По умолчанию dev-сервер Flask слушает порт 5000 (не 8000). Остановить сервер — Ctrl+C в терминале.

Разбор по строкам

app = Flask(__name__) создает приложение и по имени модуля определяет, где искать папки templates и static. Поэтому шаблоны и лежат в templates/ рядом с app.py.

Декоратор @app.route("/") привязывает функцию к адресу. Запрос на / вызывает функцию index; то, что она вернет, станет телом ответа. Добавив второй декоратор с другим путем, вы получите вторую страницу.

render_template("index.html", ...) находит файл в templates/, подставляет переданные значения вместо {{ ... }} и возвращает готовый HTML. Именованные аргументы (title, name) — это данные для шаблона.

Блок if __name__ == "__main__": запускает встроенный сервер только при прямом вызове файла. debug=True включает автоперезапуск при правках и подробную страницу ошибки — удобно при разработке, но в продакшене это отключают.

render_template или возврат строки

Различать стоит два способа отдать ответ. Функция маршрута может вернуть просто строку — тогда браузер получит ровно этот текст:

@app.route("/hello")
def hello():
    return "Привет, мир!"  # браузер покажет строку как есть

А render_template рендерит отдельный файл-шаблон через движок Jinja2: разметка живет в .html, данные приходят из Python, логика отображения (условия, циклы) — в шаблоне. Для реальной страницы удобнее второй путь: HTML не смешан с кодом.

Если страница не открылась

Диагностика по типовому симптому:

Симптом Вероятная причина Что сделать
TemplateNotFound: index.html шаблон не в папке templates/ создать папку templates рядом с app.py, положить туда файл
ModuleNotFoundError: No module named 'flask' окружение не активировано или пакет не установлен активировать venv, выполнить pip install flask
Address already in use (порт занят) 5000 занят другим процессом запустить на другом порту: app.run(debug=True, port=5001)
Браузер показывает 404 нет маршрута под этот адрес проверить путь в @app.route и адрес в браузере

Пустая или «битая» страница часто означает опечатку в имени переменной: имя в {{ name }} должно совпадать с именем аргумента в render_template(..., name=...).

Кратко про деплой

Встроенный сервер Flask предназначен только для разработки — при запуске он сам пишет предупреждение «development server, do not use it in a production deployment». Для публичного сайта его не используют.

В продакшене приложение запускают через WSGI-сервер, например Gunicorn (Linux) или Waitress (кросс-платформенно), обычно за обратным прокси nginx. Пример запуска через Gunicorn (объект приложения называется app в модуле app):

pip install gunicorn
gunicorn --bind 0.0.0.0:8000 app:app

Перед деплоем debug=True убирают: включенный отладчик на публичном сервере — это утечка внутренней информации и возможность выполнить код. Дальше подключают домен, HTTPS и, при необходимости, systemd для автозапуска — это уже отдельная большая тема.

Выводы

  • Веб-страница на Python — это HTML, который ваш код возвращает в ответ на запрос по маршруту; сам Python работает на бэкенде.
  • Минимальный сайт на Flask — это app.py с одним маршрутом плюс шаблон в папке templates/; больше для первой страницы не нужно.
  • render_template подставляет данные из Python в HTML-шаблон через Jinja2; вернуть можно и простую строку, но шаблон удобнее.
  • Локально приложение слушает http://127.0.0.1:5000/; встроенный сервер — только для разработки.
  • Для публикации нужен WSGI-сервер (Gunicorn/Waitress) и отключенный debug, а не встроенный dev-сервер.

Где применяется / связь с практикой

Такой мини-сайт — основа для форм обратной связи, личных проектов, внутренних панелей и прототипов API. От него один шаг до полноценного backend: несколько маршрутов, работа с базой данных, шаблоны с циклами и условиями. Именно так устроены и большие сервисы — просто маршрутов и слоев в них больше.

Освойте тему на практике

Разобраться с синтаксисом языка, функциями и работой с данными системно помогает курс Python Basic: на нем отрабатывают базу, на которую затем ложатся Flask и Django. Посмотреть формат занятий и попробовать тему бесплатно можно на открытых уроках Otus — там разбирают практические задачи вживую.

FAQ

Обязательно ли учить HTML и CSS для страницы на Python?
Минимальный HTML нужен — без него нечего отдавать браузеру. Python отвечает за серверную часть и подстановку данных, а внешний вид страницы задают HTML и CSS.

Flask или Django для первого сайта?
Для одной страницы и знакомства с вебом проще Flask: меньше кода и понятий. Django оправдан, когда нужны админка, ORM и заданная структура крупного проекта.

Почему страница видна только у меня по адресу 127.0.0.1?
127.0.0.1 (localhost) — это ваш же компьютер, снаружи он недоступен. Чтобы страницу увидели другие, приложение разворачивают на сервере через WSGI-сервер и настраивают домен.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)