Медиаблог /

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

16 мая 2026

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

Flask — микрофреймворк для веб-разработки на Python, который Армин Роначер создал в 2010 году. Сегодня его поддерживает организация Pallets Projects. Минимальное ядро включает маршрутизацию, шаблонизатор Jinja2 и поддержку WSGI — этого достаточно, чтобы запустить первое приложение за 30 минут, зная основы Python. Flask для начинающих удобен прежде всего тем, что нет скрытой «магии»: вы видите, […]

Разработчик создаёт первое веб-приложение на Flask с Python
Принять участие

Учитесь IT бесплатно.
Обучение по программам занимает не более 4 часов
в неделю

Принять участие

Flask — микрофреймворк для веб-разработки на Python, который Армин Роначер создал в 2010 году. Сегодня его поддерживает организация Pallets Projects. Минимальное ядро включает маршрутизацию, шаблонизатор Jinja2 и поддержку WSGI — этого достаточно, чтобы запустить первое приложение за 30 минут, зная основы Python.

Flask для начинающих удобен прежде всего тем, что нет скрытой «магии»: вы видите, что происходит на каждом шаге. В этом руководстве вы создадите веб-приложение на Python с маршрутами, HTML-шаблонами и базой данных SQLite — всего 8 шагов.

Потребуется:

  • Python 3.8 или выше;
  • базовое знание Python: переменные, функции, циклы;
  • любой редактор кода — VS Code, PyCharm или другой.

Что такое Flask и зачем он нужен

Flask — микрофреймворк: минималистичный каркас, который даёт только основное — маршрутизацию запросов, шаблонизатор Jinja2 и инструментарий Werkzeug с поддержкой WSGI (Web Server Gateway Interface — стандартный интерфейс между Python-приложением и веб-сервером). Остальное разработчик добавляет сам по мере необходимости.

Flask входит в топ-15 мировых веб-фреймворков и используется в production Pinterest, Netflix, Uber, Reddit и Twilio. Расширяемость фреймворка — главная особенность: подключаете SQLAlchemy для базы данных, Flask-Login для авторизации, Flask-Migrate для миграций — только то, что нужно конкретному проекту. Именно это делает Flask для начинающих одним из лучших вариантов старта в веб-разработке.

Flask, Django и FastAPI — что выбрать новичку

Три самых популярных веб-фреймворка 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, когда проект вырастет.

Что понадобится для работы с Flask

Прежде чем писать первую строку кода, проверьте окружение.

Чек-лист:

  • Python 3.8 или выше — python3 —version в терминале покажет текущую версию. Если Python старше 3.8, обновите с официального сайта python.org.
  • pip — менеджер пакетов Python, входит в комплект начиная с версии 3.4, отдельно устанавливать не нужно. Проверьте: pip —version.
  • Редактор кода — VS Code, PyCharm или любой другой на ваш выбор.
  • Виртуальное окружение (venv) — изолирует зависимости проекта и предотвращает конфликты между библиотеками разных проектов. Важно: создайте его до установки Flask.

На Windows активация виртуального окружения отличается от Linux и macOS — об этом подробно в Шаге 2. В остальном процесс установки идентичен на всех платформах.

Пошаговая установка Flask и настройка рабочей среды

Три действия перед первым запуском: создать виртуальное окружение, установить Flask, проверить версию. Flask устанавливается только внутри активированного venv — иначе пакет попадёт в системный Python и вызовет конфликты зависимостей между проектами. Официальная документация по установке — palletsprojects.com.

Инфографика: 8 шагов создания веб-приложения на Flask для начинающих

Шаг 1. Проверьте версию Python и наличие pip

Откройте терминал и выполните две команды:

python3 —version

pip —version

Нужна версия Python 3.8 или выше. Если вывод показывает более раннюю версию — загрузите актуальный дистрибутив с python.org. pip входит в стандартную поставку Python 3.4+, отдельно устанавливать не нужно. Если pip всё же не найден: python3 -m ensurepip.

Работаете в PyCharm? Откройте встроенный Terminal сочетанием Alt+F12 — те же команды работают и там. При создании нового проекта PyCharm предложит создать виртуальное окружение автоматически: соглашайтесь, это сэкономит следующий шаг.

Шаг 2. Создайте и активируйте виртуальное окружение

Перейдите в папку проекта и создайте окружение:

python3 -m venv .venv

Активируйте его:

  • Linux / macOS: source .venv/bin/activate
  • Windows: .venv\Scripts\activate

После активации в начале строки терминала появится префикс (.venv) — признак того, что окружение активно. Все пакеты, установленные теперь, будут изолированы внутри папки .venv и не затронут другие проекты.

Виртуальное окружение предотвращает несовместимость зависимостей: если один проект требует Flask 2.x, а другой Flask 3.x — каждый живёт в своём изолированном пространстве без конфликтов между библиотеками.

Терминал с командами создания виртуального окружения и установки Flask

Шаг 3. Установите Flask и зафиксируйте зависимости

Убедитесь, что 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-проекта: файлы и папки

Структура файлов Flask-проекта: app.py, templates и static папки

Типичное дерево Flask-проекта:

my_project/

├── app.py

├── config.py

├── models.py

├── requirements.txt

├── .venv/

├── templates/

│   ├── base.html

│   └── index.html

└── static/

├── css/

└── js/

Роль каждого компонента:

  • app.py — точка входа: здесь создаётся объект Flask, регистрируются маршруты и запускается сервер.
  • templates/ — обязательное имя папки. Jinja2 ищет HTML-файлы именно здесь по умолчанию; переименовывать без явной настройки нельзя.
  • static/ — CSS, JavaScript, изображения. Flask отдаёт файлы из этой папки автоматически по пути /static/.
  • config.py — конфигурация: SECRET_KEY, параметры базы данных, режим отладки.

Хранить маршруты, модели и конфигурацию в одном app.py удобно для небольших проектов. Когда приложение растёт — используйте Flask Blueprints для разбивки на независимые модули.

Маршруты, URL и обработка запросов во Flask

Маршрутизация запросов во Flask строится через декораторы (decorator — синтаксическая конструкция Python, модифицирующая поведение функции): @app.route(‘/путь’) связывает URL с view-функцией. Метод GET используется для получения данных, POST — для их отправки. Объект request даёт доступ к параметрам: request.args для GET-параметров, request.form для POST-данных, request.method — тип текущего запроса.

Шаг 4. Создайте первый маршрут и запустите Flask-сервер

Браузер открывает Hello World на localhost Flask-приложения для начинающих

Создайте файл app.py:

from flask import Flask

app = Flask(__name__)

@app.route(‘/’)

def index():

return ‘Hello, World!’

if __name__ == ‘__main__’:

app.run(debug=True)

Ключевые моменты:

  • Flask(__name__) — создаёт экземпляр приложения. Аргумент __name__ сообщает Flask, где находится файл и где искать папку templates.
  • debug=True — включает автоматическую перезагрузку при изменении кода и подробные сообщения об ошибках. Только для разработки: в production не включать никогда.

Запустите сервер:

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 разберём, чем его заменить.

Шаг 5. Добавьте динамические маршруты и обработку GET/POST

Динамические маршруты принимают параметры прямо из 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

Несколько важных паттернов из этого примера:

  • <int:post_id> — конвертер типа: Flask автоматически преобразует строку URL в целое число.
  • url_for(‘user_profile’, username=name) — генерирует URL для указанной view-функции. Безопаснее хардкода: если маршрут изменится, url_for обновит все ссылки автоматически.
  • redirect(url_for(…)) после POST — паттерн Post/Redirect/Get: обработали форму → сохранили данные → перенаправили на GET. Предотвращает повторную отправку при обновлении страницы.
  • @app.errorhandler(404) — кастомная страница для ошибки «не найдено».

HTML-шаблоны и шаблонизатор Jinja2

Возвращать HTML строками неудобно уже на третьем маршруте. Jinja2 (шаблонизатор, устанавливается вместе с Flask) поможет разобраться с этим: функция render_template() принимает имя HTML-файла и данные из Python, возвращает готовую страницу. Главная возможность — наследование шаблонов: один базовый файл содержит общий каркас, дочерние страницы переопределяют только нужные блоки. Принцип DRY (Don’t Repeat Yourself — не дублируй код) в действии.

Шаг 6. Создайте базовый шаблон и настройте наследование

Схема наследования шаблонов Jinja2: base.html передаёт структуру дочерним страницам

Создайте 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:

  • {{ var }} — вывод переменной;
  • {% if %} / {% endif %} — условие;
  • {% for item in list %} / {% endfor %} — цикл;
  • {% block name %} / {% endblock %} — именованный блок для переопределения;
  • {% extends «base.html» %} — наследование от родительского шаблона.

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)

Подключение базы данных: SQLAlchemy и SQLite

Flask не включает ORM (Object-Relational Mapper — инструмент для работы с базой данных через Python-объекты вместо SQL-запросов вручную), но легко интегрируется с SQLAlchemy через расширение Flask-SQLAlchemy. SQLite — встроенная в Python реляционная база данных без необходимости устанавливать отдельный сервер — идеальна для обучения и прототипирования. Flask-SQLAlchemy связывает Flask и SQLAlchemy в единое целое.

Шаг 7. Настройте SQLite и определите модели данных

Установите расширения:

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.

Шаг 8. Реализуйте операции CRUD

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 превращают статичные страницы в динамические веб-приложения, работающие с пользовательскими данными в реальном времени.

Запуск Flask в production через Gunicorn

Три уровня деплоя Flask-приложения: Dev Server, Gunicorn и Nginx

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

Здесь:

  • -w 4 — количество воркеров (рабочих процессов). Рекомендуемая формула: 2 × количество CPU-ядер + 1.
  • app:app — имя модуля и имя объекта Flask внутри него.

Три уровня деплоя (развёртывания) Flask-приложения:

  1. Flask dev server — только для локальной разработки, один поток.
  2. Gunicorn — production: несколько воркеров обрабатывают параллельные запросы.
  3. Nginx + Gunicorn — для высокой нагрузки. Nginx работает как reverse proxy (обратный прокси — сервер, принимающий внешние запросы и перенаправляющий их приложению), отдаёт статику и управляет SSL-сертификатом.

Типичные ошибки при работе с 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, как описано в предыдущем разделе.

Куда двигаться дальше после освоения Flask

Баннер курса по программированию на Python для уверенного старта в разработке

Освоив 8 шагов этого руководства, вы знаете достаточно для первых реальных проектов. Что изучать дальше:

  • Flask Blueprints — модуляризация приложения: разбивает крупный проект на независимые компоненты с собственными маршрутами и шаблонами.
  • REST API — jsonify() для простых ответов, Flask-RESTful для полноценного API с версионированием и классами ресурсов.
  • PostgreSQL вместо SQLite — для production с высокой нагрузкой и параллельными запросами.
  • Деплой — Gunicorn + Nginx + облачный VPS; стандартная связка для боевых Flask-приложений.
  • FastAPI — если нужна асинхронность и автодокументация API. Django — когда проект вырастает до уровня, где нужна встроенная Admin-панель.

Flask для начинающих — точка входа в веб-разработку на Python. После него любой из следующих фреймворков освоить значительно проще.

Хотите освоить Flask на практике с реальными проектами? На курсе «Программирование: уверенный старт» третий модуль целиком посвящён веб-разработке: Flask, Jinja2 и SQLite — от первого маршрута до готового веб-приложения с базой данных. Формат: 36 часов онлайн, бесплатно. Узнайте подробнее на странице курса.

Часто задаваемые вопросы

Для чего используют Flask в Python?

Flask применяют для создания веб-приложений и REST API: лендинги, блоги, многостраничные сайты, микросервисы, внутренние инструменты. Крупные компании (Pinterest, Netflix, Uber, Reddit и Twilio) используют Flask в production. Архитектура микрофреймворка позволяет подключать только нужное: SQLAlchemy для базы данных, Flask-Login для авторизации, Flask-Migrate для миграций схемы.

Чем Flask отличается от Django?

Flask — микрофреймворк: даёт маршрутизацию и Jinja2, остальное подключается по необходимости. Django — полный стек: ORM, Admin-панель, авторизация из коробки. Flask подходит для прототипов и нестандартной архитектуры; Django — для крупных проектов с предсказуемой структурой. Для новичка Flask проще: меньше встроенных абстракций, понятнее, что происходит под капотом.

Как работают сессии и куки во Flask?

Сессия хранится на сервере и удаляется при закрытии браузера; в браузере хранится только идентификатор сессии. Куки сохраняются длительно (опция «Запомнить меня»). Flask требует SECRET_KEY в конфигурации. Flask-Login управляет сессиями через login_user(), logout_user() и декоратор @login_required для защиты отдельных маршрутов.

Как загрузить файл через Flask?

Используйте 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’].

Как создать JSON API на Flask?

Используйте jsonify(): return jsonify({‘key’: ‘value’}). Укажите методы маршрута: methods=[‘GET’, ‘POST’]. Для чтения JSON из запроса: request.json. Для полноценного REST API рассмотрите Flask-RESTful — добавляет классы ресурсов и автоматическую сериализацию данных.

Как установить Flask в PyCharm?

Создайте новый проект — PyCharm автоматически предложит создать venv. Откройте Terminal сочетанием Alt+F12 и выполните pip install Flask: окружение уже активировано. Для запуска настройте Run Configuration (укажите app.py как точку входа) либо прямо в Terminal выполните python app.py.

Что такое url_for() и redirect() во Flask?

url_for(‘view_function’) генерирует URL для view-функции — безопаснее хардкода, автоматически обновляется при изменении маршрута. redirect(url_for(‘home’)) отправляет пользователя на другую страницу. Используется после POST-запроса по паттерну Post/Redirect/Get: обработка формы → сохранение данных → redirect → GET-запрос главной страницы.

Какие известные сайты работают на Flask?

Pinterest (социальная сеть для изображений), Netflix (видеостриминг), Uber (транспортная платформа), Reddit (новостной агрегатор) и Twilio (коммуникационная платформа) — все используют Flask в production. Flask входит в топ-15 мировых веб-фреймворков и поддерживается Pallets Projects — той же организацией, которая разрабатывает Jinja2 и Werkzeug.