Flask — микрофреймворк для веб-разработки на Python, который Армин Роначер создал в 2010 году. Сегодня его поддерживает организация Pallets Projects. Минимальное ядро включает маршрутизацию, шаблонизатор Jinja2 и поддержку WSGI — этого достаточно, чтобы запустить первое приложение за 30 минут, зная основы Python. Flask для начинающих удобен прежде всего тем, что нет скрытой «магии»: вы видите, […]
Flask — микрофреймворк для веб-разработки на Python, который Армин Роначер создал в 2010 году. Сегодня его поддерживает организация Pallets Projects. Минимальное ядро включает маршрутизацию, шаблонизатор Jinja2 и поддержку WSGI — этого достаточно, чтобы запустить первое приложение за 30 минут, зная основы Python.
Flask для начинающих удобен прежде всего тем, что нет скрытой «магии»: вы видите, что происходит на каждом шаге. В этом руководстве вы создадите веб-приложение на Python с маршрутами, HTML-шаблонами и базой данных SQLite — всего 8 шагов.
Потребуется:
Flask — микрофреймворк: минималистичный каркас, который даёт только основное — маршрутизацию запросов, шаблонизатор Jinja2 и инструментарий Werkzeug с поддержкой WSGI (Web Server Gateway Interface — стандартный интерфейс между Python-приложением и веб-сервером). Остальное разработчик добавляет сам по мере необходимости.
Flask входит в топ-15 мировых веб-фреймворков и используется в production Pinterest, Netflix, Uber, Reddit и Twilio. Расширяемость фреймворка — главная особенность: подключаете SQLAlchemy для базы данных, Flask-Login для авторизации, Flask-Migrate для миграций — только то, что нужно конкретному проекту. Именно это делает Flask для начинающих одним из лучших вариантов старта в веб-разработке.
Три самых популярных веб-фреймворка Python решают разные задачи.
| Характеристика | Flask | Django | FastAPI |
|---|---|---|---|
| Тип | Микрофреймворк | Полный стек | Микрофреймворк |
| ORM | Flask-SQLAlchemy (подключается) | Встроенная | SQLAlchemy (опционально) |
| Admin-панель | Нет / Flask-Admin | Встроенная | Нет |
| Шаблонизатор | Jinja2 | Django Templates | Нет (API-ориентирован) |
| Кривая обучения | Низкая | Средняя | Средняя |
| Гибкость | Высокая | Средняя | Высокая |
| Лучшие сценарии | Прототипы, малые проекты, REST API | Крупные проекты с Admin | Асинхронные API |
Таблица 1. Сравнение Flask, Django и FastAPI по ключевым характеристикам. Источник: официальная документация Pallets Projects, Django Project, FastAPI, 2025.
Flask лучше подходит для прототипов, небольших проектов и нестандартной архитектуры. Django даёт больше «из коробки», ORM, Admin-панель, авторизацию, и выигрывает на крупных проектах с предсказуемой структурой. FastAPI (асинхронный фреймворк с автоматической документацией) оптимален, когда уже есть опыт работы с типизированным Python.
Вывод простой: Flask для начинающих — оптимальный старт, меньше встроенных абстракций, понятнее, что происходит под капотом. Переходите на Django или FastAPI, когда проект вырастет.
Прежде чем писать первую строку кода, проверьте окружение.
Чек-лист:
На Windows активация виртуального окружения отличается от Linux и macOS — об этом подробно в Шаге 2. В остальном процесс установки идентичен на всех платформах.
Три действия перед первым запуском: создать виртуальное окружение, установить Flask, проверить версию. Flask устанавливается только внутри активированного venv — иначе пакет попадёт в системный Python и вызовет конфликты зависимостей между проектами. Официальная документация по установке — palletsprojects.com.

Откройте терминал и выполните две команды:
python3 —version
pip —version
Нужна версия Python 3.8 или выше. Если вывод показывает более раннюю версию — загрузите актуальный дистрибутив с python.org. pip входит в стандартную поставку Python 3.4+, отдельно устанавливать не нужно. Если pip всё же не найден: python3 -m ensurepip.
Работаете в PyCharm? Откройте встроенный Terminal сочетанием Alt+F12 — те же команды работают и там. При создании нового проекта PyCharm предложит создать виртуальное окружение автоматически: соглашайтесь, это сэкономит следующий шаг.
Перейдите в папку проекта и создайте окружение:
python3 -m venv .venv
Активируйте его:
После активации в начале строки терминала появится префикс (.venv) — признак того, что окружение активно. Все пакеты, установленные теперь, будут изолированы внутри папки .venv и не затронут другие проекты.
Виртуальное окружение предотвращает несовместимость зависимостей: если один проект требует Flask 2.x, а другой Flask 3.x — каждый живёт в своём изолированном пространстве без конфликтов между библиотеками.

Убедитесь, что venv активирован (виден префикс .venv), и выполните установку:
pip install Flask
Проверьте результат:
python -m flask —version
Вместе с Flask автоматически устанавливаются Jinja2, Werkzeug и Click — все три входят в экосистему Pallets Projects и работают как единый набор инструментов.
Зафиксируйте зависимости:
pip freeze > requirements.txt
Файл requirements.txt позволит воспроизвести окружение на другом компьютере командой pip install -r requirements.txt.

Типичное дерево Flask-проекта:
my_project/
├── app.py
├── config.py
├── models.py
├── requirements.txt
├── .venv/
├── templates/
│ ├── base.html
│ └── index.html
└── static/
├── css/
└── js/
Роль каждого компонента:
Хранить маршруты, модели и конфигурацию в одном app.py удобно для небольших проектов. Когда приложение растёт — используйте Flask Blueprints для разбивки на независимые модули.
Маршрутизация запросов во Flask строится через декораторы (decorator — синтаксическая конструкция Python, модифицирующая поведение функции): @app.route(‘/путь’) связывает URL с view-функцией. Метод GET используется для получения данных, POST — для их отправки. Объект request даёт доступ к параметрам: request.args для GET-параметров, request.form для POST-данных, request.method — тип текущего запроса.

Создайте файл app.py:
from flask import Flask
app = Flask(__name__)
@app.route(‘/’)
def index():
return ‘Hello, World!’
if __name__ == ‘__main__’:
app.run(debug=True)
Ключевые моменты:
Запустите сервер:
python app.py
Откройте браузер по адресу http://127.0.0.1:5000/ — увидите «Hello, World!». В терминале Flask выведет предупреждение: «WARNING: This is a development server. Do not use it in a production deployment». Не игнорируйте его — в разделе про Gunicorn разберём, чем его заменить.
Динамические маршруты принимают параметры прямо из URL:
from flask import Flask, request, redirect, url_for
app = Flask(__name__)
@app.route(‘/user/<username>’)
def user_profile(username):
return f’Профиль: {username}’
@app.route(‘/post/<int:post_id>’)
def show_post(post_id):
return f’Статья №{post_id}’
@app.route(‘/submit’, methods=[‘GET’, ‘POST’])
def submit():
if request.method == ‘POST’:
name = request.form[‘name’]
return redirect(url_for(‘user_profile’, username=name))
return ‘<form method=»post»><input name=»name»><button>OK</button></form>’
@app.errorhandler(404)
def not_found(e):
return ‘Страница не найдена’, 404
Несколько важных паттернов из этого примера:
Возвращать HTML строками неудобно уже на третьем маршруте. Jinja2 (шаблонизатор, устанавливается вместе с Flask) поможет разобраться с этим: функция render_template() принимает имя HTML-файла и данные из Python, возвращает готовую страницу. Главная возможность — наследование шаблонов: один базовый файл содержит общий каркас, дочерние страницы переопределяют только нужные блоки. Принцип DRY (Don’t Repeat Yourself — не дублируй код) в действии.

Создайте templates/base.html:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Мой сайт{% endblock %}</title>
<link rel=»stylesheet»
href=»https://cdn.jsdelivr.net/npm/bootstrap@5/dist/css/bootstrap.min.css»>
</head>
<body>
<div class=»container»>
{% block content %}{% endblock %}
</div>
</body>
</html>
Создайте templates/index.html:
{% extends «base.html» %}
{% block title %}Главная{% endblock %}
{% block content %}
<h1>Привет, {{ username }}!</h1>
{% if posts %}
{% for post in posts %}
<p>{{ post.title }}</p>
{% endfor %}
{% else %}
<p>Записей пока нет.</p>
{% endif %}
{% endblock %}
Синтаксис Jinja2:
Bootstrap CDN в base.html автоматически применяет адаптивные стили ко всем дочерним страницам — подключать их отдельно не нужно. В маршруте передавайте данные через render_template:
from flask import render_template
@app.route(‘/’)
def index():
posts = [{‘title’: ‘Первая статья’}, {‘title’: ‘Вторая статья’}]
return render_template(‘index.html’, username=’Алексей’, posts=posts)
Flask не включает ORM (Object-Relational Mapper — инструмент для работы с базой данных через Python-объекты вместо SQL-запросов вручную), но легко интегрируется с SQLAlchemy через расширение Flask-SQLAlchemy. SQLite — встроенная в Python реляционная база данных без необходимости устанавливать отдельный сервер — идеальна для обучения и прототипирования. Flask-SQLAlchemy связывает Flask и SQLAlchemy в единое целое.
Установите расширения:
pip install flask-sqlalchemy flask-migrate
Настройте app.py:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite:///database.db’
app.config[‘SECRET_KEY’] = ‘your-secret-key’
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
with app.app_context():
db.create_all()
db.create_all() создаёт таблицы в базе по описанным моделям. Для управления изменениями схемы в production используйте Flask-Migrate:
flask db init
flask db migrate -m «initial»
flask db upgrade
Выбор базы данных зависит от задачи:
| Параметр | SQLite | PostgreSQL |
|---|---|---|
| Настройка | Не нужна (встроена в Python) | Требует установки сервера |
| Основной сценарий | Разработка, обучение, прототипы | Production, высокая нагрузка |
| Конкурентные запросы | Ограничена | Полная поддержка |
| Масштабируемость | Малые проекты | Крупные системы |
| Когда переходить | При росте нагрузки | — |
Таблица 2. Сравнение SQLite и PostgreSQL для Flask-проектов. Источник: документация SQLAlchemy, 2025.
CRUD (Create, Read, Update, Delete — создание, чтение, обновление, удаление) — базовый набор операций с данными. Flask-SQLAlchemy реализует их через объект сессии:
# Create — создание
new_user = User(username=’alex’, email=’alex@example.com’)
db.session.add(new_user)
db.session.commit()
# Read — чтение
all_users = User.query.all()
user = User.query.filter_by(username=’alex’).first()
# Update — обновление
user.email = ‘new@example.com’
db.session.commit()
# Delete — удаление
db.session.delete(user)
db.session.commit()
Типичный маршрут с формой и операциями CRUD:
@app.route(‘/create’, methods=[‘GET’, ‘POST’])
def create_user():
if request.method == ‘POST’:
username = request.form[‘username’]
email = request.form[’email’]
user = User(username=username, email=email)
db.session.add(user)
db.session.commit()
return redirect(url_for(‘index’))
return render_template(‘create.html’)
Паттерн: принять POST → валидировать → db.session.add() → commit() → redirect(). Операции CRUD превращают статичные страницы в динамические веб-приложения, работающие с пользовательскими данными в реальном времени.

WSGI (Web Server Gateway Interface, описан в стандарте PEP 3333) — интерфейс, определяющий, как Python-приложение взаимодействует с веб-сервером. Flask реализует WSGI, поэтому совместим с любым WSGI-совместимым сервером.
Встроенный Flask dev server однопоточный: обрабатывает один запрос за раз и не предназначен для реальной нагрузки. Gunicorn (Green Unicorn — многопроцессорный WSGI-сервер) заменяет его в production:
pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:5000 app:app
Здесь:
Три уровня деплоя (развёртывания) Flask-приложения:
Несколько ошибок встречаются почти у всех, кто начинает работу с Flask.
ModuleNotFoundError: No module named ‘flask’ — Flask не найден. Причина: команда запуска выполнена вне виртуального окружения. Решение: активировать venv (проверьте префикс .venv в терминале) и повторить запуск.
TemplateNotFoundError — Jinja2 не может найти шаблон. Причина: папка названа иначе или лежит в другом месте. Решение: папка должна называться строго templates и находиться рядом с app.py.
CSRF-ошибка при POST — отсутствует SECRET_KEY. Решение: добавить app.config[‘SECRET_KEY’] = ‘уникальная-строка’ в конфигурацию приложения.
404 без пояснения — нет кастомной страницы ошибки. Решение: добавить @app.errorhandler(404) с информативным ответом пользователю.
Конфликты зависимостей между проектами — пакеты установлены в глобальный Python. Решение: каждый проект в отдельном venv. Не устанавливайте Flask без активированного окружения.
«Development server» warning в production — проигнорированное предупреждение. Решение: переключитесь на Gunicorn, как описано в предыдущем разделе.

Освоив 8 шагов этого руководства, вы знаете достаточно для первых реальных проектов. Что изучать дальше:
Flask для начинающих — точка входа в веб-разработку на Python. После него любой из следующих фреймворков освоить значительно проще.
Хотите освоить Flask на практике с реальными проектами? На курсе «Программирование: уверенный старт» третий модуль целиком посвящён веб-разработке: Flask, Jinja2 и SQLite — от первого маршрута до готового веб-приложения с базой данных. Формат: 36 часов онлайн, бесплатно. Узнайте подробнее на странице курса.
Flask применяют для создания веб-приложений и REST API: лендинги, блоги, многостраничные сайты, микросервисы, внутренние инструменты. Крупные компании (Pinterest, Netflix, Uber, Reddit и Twilio) используют Flask в production. Архитектура микрофреймворка позволяет подключать только нужное: SQLAlchemy для базы данных, Flask-Login для авторизации, Flask-Migrate для миграций схемы.
Flask — микрофреймворк: даёт маршрутизацию и Jinja2, остальное подключается по необходимости. Django — полный стек: ORM, Admin-панель, авторизация из коробки. Flask подходит для прототипов и нестандартной архитектуры; Django — для крупных проектов с предсказуемой структурой. Для новичка Flask проще: меньше встроенных абстракций, понятнее, что происходит под капотом.
Сессия хранится на сервере и удаляется при закрытии браузера; в браузере хранится только идентификатор сессии. Куки сохраняются длительно (опция «Запомнить меня»). Flask требует SECRET_KEY в конфигурации. Flask-Login управляет сессиями через login_user(), logout_user() и декоратор @login_required для защиты отдельных маршрутов.
Используйте request.files[‘file’] для получения файла из формы. Добавьте атрибут enctype=»multipart/form-data» в HTML-форму. Для сохранения: file.save(os.path.join(UPLOAD_FOLDER, filename)). Для безопасности применяйте werkzeug.utils.secure_filename() — очищает имя файла от небезопасных символов. Максимальный размер задаётся через app.config[‘MAX_CONTENT_LENGTH’].
Используйте jsonify(): return jsonify({‘key’: ‘value’}). Укажите методы маршрута: methods=[‘GET’, ‘POST’]. Для чтения JSON из запроса: request.json. Для полноценного REST API рассмотрите Flask-RESTful — добавляет классы ресурсов и автоматическую сериализацию данных.
Создайте новый проект — PyCharm автоматически предложит создать venv. Откройте Terminal сочетанием Alt+F12 и выполните pip install Flask: окружение уже активировано. Для запуска настройте Run Configuration (укажите app.py как точку входа) либо прямо в Terminal выполните python app.py.
url_for(‘view_function’) генерирует URL для view-функции — безопаснее хардкода, автоматически обновляется при изменении маршрута. redirect(url_for(‘home’)) отправляет пользователя на другую страницу. Используется после POST-запроса по паттерну Post/Redirect/Get: обработка формы → сохранение данных → redirect → GET-запрос главной страницы.
Pinterest (социальная сеть для изображений), Netflix (видеостриминг), Uber (транспортная платформа), Reddit (новостной агрегатор) и Twilio (коммуникационная платформа) — все используют Flask в production. Flask входит в топ-15 мировых веб-фреймворков и поддерживается Pallets Projects — той же организацией, которая разрабатывает Jinja2 и Werkzeug.