Веб-страница на 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-сервер и настраивают домен.



