Что такое фреймворк

Ноутбук с открытым кодом веб-приложения на столе разработчика Технологии

Фреймворк даёт готовую основу приложения: он сам принимает запросы, обрабатывает ошибки и запускает код, который вы в него вписали. Вы не пишете программу с нуля, а заполняете пустые места в чужой, уже работающей программе.

Отсюда главное отличие от библиотеки. Библиотеку вызываете вы, когда она вам нужна. Фреймворк вызывает вас, когда приходит его время, и вдобавок решает, как устроено всё приложение.

Что такое фреймворк простыми словами

Слово пришло из английского: framework значит «каркас, рама, остов». В программировании это платформа, которая задаёт структуру программы. Она решает, из каких частей состоит проект, где лежат файлы и в каком порядке выполняется код.

Похоже на бланк заявления. Поля уже размечены: фамилия здесь, дата там, подпись внизу. Вы вписываете только своё, а форма задаёт, где что писать. Разработчик пишет логику: что показать на главной странице и кого пустить в личный кабинет. Принять HTTP-запрос, разобрать адрес, выбрать нужную функцию, превратить её результат в ответ браузеру берёт на себя фреймворк.

Набор инструментов у фреймворков разный, но типовые задачи повторяются: маршрутизация адресов, работа с базой данных, шаблоны страниц, формы и их проверка, авторизация пользователей, защита от частых атак, запуск тестов. Писать всё это для каждого проекта заново долго, и в самодельном коде легко оставить дыру. Поэтому для приложения с пользователями, базой данных и десятком страниц разумно сразу брать фреймворк.

Чем фреймворк отличается от библиотеки

Библиотека состоит из функций, которые вы вызываете сами. Каждый вызов делает работу и возвращает управление вашему коду. Порядок программы определяете вы. Вот библиотека json из стандартной поставки Python:

import json

raw = '{"name": "Аня", "langs": ["Python", "SQL"]}'
user = json.loads(raw)      # вызвали функцию, получили словарь
print(user["langs"])
print(len(user["langs"]))
['Python', 'SQL']
2

Ваш код решил, когда разобрать строку, получил словарь и пошёл дальше. Библиотека не знает, что у вас за программа, и ни на что в ней не влияет. Так же работает библиотека matplotlib: вы вызываете plot(), когда вам нужен график.

С фреймворком наоборот. Вы пишете функции и отдаёте их фреймворку, а когда их запустить, решает он. Такой принцип зовут инверсией управления, а в шутку голливудским принципом: «не звоните нам, мы сами вам позвоним». Отсюда второй признак: фреймворк задаёт устройство приложения. Раз он запускает ваш код, код должен лежать там и выглядеть так, как фреймворк ожидает.

Библиотека Фреймворк
Кто кого вызывает ваш код вызывает библиотеку фреймворк вызывает ваш код
Структура проекта любая задана фреймворком
Замена на другую обычно правка нескольких вызовов часто переписывание приложения
Примеры json, requests, NumPy, jQuery Django, Flask, Spring, Angular

Размер тут ни при чём: библиотека бывает очень большой, а фреймворк маленьким.

Как работает фреймворк: свой на Python в 23 строки

Проще всего понять, как фреймворк устроен внутри, написав игрушечный. Класс ниже умеет три вещи: запоминать, какая функция отвечает за какой адрес, запускать её на запрос и отвечать кодом ошибки, если функции нет или она упала. Примеры проверены на Python 3.14.

class TinyFramework:
    def __init__(self):
        self.routes = {}

    def route(self, path):
        def register(func):
            self.routes[path] = func   # запоминаем функцию, но не вызываем
            return func
        return register

    def handle(self, path):
        func = self.routes.get(path)
        if func is None:
            return 404, "Not Found"
        try:
            return 200, func()          # здесь каркас вызывает ваш код
        except Exception as e:
            return 500, f"Internal Server Error ({type(e).__name__})"

    def run(self, paths):
        for path in paths:
            status, body = self.handle(path)
            print(path, status, body)

Это часть «фреймворка». Теперь код приложения, то есть то, что пишет разработчик, который им пользуется:

app = TinyFramework()

@app.route("/")
def index():
    return "Главная"

@app.route("/broken")
def broken():
    return 1 / 0

app.run(["/", "/about", "/broken"])
/ 200 Главная
/about 404 Not Found
/broken 500 Internal Server Error (ZeroDivisionError)

В коде приложения нет ни одного вызова index() или broken(). С помощью декоратора @app.route функция только попадает в словарь routes, а запускает её метод handle, когда приходит подходящий адрес. Для /about функции нет, и фреймворк сам отвечает 404. Функция broken делит на ноль, но программа не падает: исключение ловит фреймворк и превращает его в ответ 500.

Разработчик смотрит на два окна с кодом на широком мониторе

Тот же пример на Flask

Flask 3.1 (проверено на версии 3.1.3) устроен по той же схеме, только вместо списка адресов он принимает настоящие HTTP-запросы. Установка: pip install flask. Если Python ответит, что модуль не найден, разберитесь с окружением по статье про ModuleNotFoundError. Сервер для проверки запускать не нужно: тестовый клиент Flask отправляет запросы прямо в приложение, и это упрощает тесты.

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Главная"

@app.route("/broken")
def broken():
    return 1 / 0

client = app.test_client()          # запросы без запуска сервера
for path in ["/", "/about", "/broken"]:
    response = client.get(path)
    print(path, response.status_code, response.content_type)
print(client.get("/").get_data(as_text=True))
/ 200 text/html; charset=utf-8
/about 404 text/html; charset=utf-8
/broken 500 text/html; charset=utf-8
Главная

Коды ответа те же: 200, 404, 500. Строку, которую вернула функция, Flask сам упаковал в HTTP-ответ с типом text/html. На /broken он ещё и записал в консоль ошибку Exception on /broken [GET] с полной трассировкой и строкой ZeroDivisionError: division by zero.

Для настоящего запуска файл сохраняют, например, как hello.py и выполняют flask --app hello run. Встроенный сервер слушает http://127.0.0.1:5000 и рассчитан на разработку: для продакшена он, скорее всего, не подойдёт. С флагом --debug включаются отладчик и автоперезапуск при изменениях в коде.

Частая ошибка новичков: назвать свой файл flask.py. Тогда Python импортирует ваш файл вместо фреймворка. В Python 3.14 сообщение выглядит так (путь у вас будет свой):

ImportError: cannot import name 'Flask' from 'flask' (consider renaming '...\\flask.py' if it has the same name as a library you intended to import)

Подсказку «consider renaming» Python печатает начиная с версии 3.13. Переименуйте файл, например, в app.py: такое имя Flask находит сам, без опции --app.

Окно терминала и браузер с локальным сайтом на мониторе

Из чего состоит фреймворк и какую архитектуру он задаёт

Состав зависит от типа, но основные части у веб-фреймворков похожи. Маршрутизатор сопоставляет адрес страницы и функцию. ORM переводит работу с базой данных на язык классов, чтобы не писать SQL руками в каждом месте. Шаблонизатор собирает HTML из заготовки и данных, во Flask это Jinja. Слой промежуточной обработки (middleware) пропускает каждый запрос через общие проверки: сессии, авторизацию, заголовки. Ещё есть консольные команды для запуска и миграций и средства для тестов.

Многие фреймворки раскладывают эти части по схеме MVC (model-view-controller). Модель отвечает за данные и бизнес-логику, представление за то, что видит пользователь, контроллер принимает запрос и связывает одно с другим. Ruby on Rails построен как full-stack фреймворк по модели MVC. Подробнее о самой схеме и её соседях есть в разборе архитектурных паттернов.

У Django названия другие: он ближе к схеме MTV (model, template, view). Здесь view решает, какие данные показать, template решает, как они выглядят, а роль контроллера играет сам фреймворк.

Фреймворк может диктовать и структуру папок. Команда django-admin startproject создаёт каталог с файлами settings.py и urls.py, а каждое приложение внутри (startapp) получает свои models.py и views.py. Flask почти ничего не требует, кроме объекта приложения. Человек, знакомый с фреймворком, в чужом проекте сразу знает, где искать маршруты, модели и шаблоны.

Серверная стойка с сетевыми кабелями и индикаторами

Виды фреймворков и примеры по языкам

В веб-разработке фреймворки удобно делить по задаче, которую они решают, и по размеру.

Бэкенд-фреймворки

Бэкенд работает на сервере: принимает запросы, ходит в базу, отдаёт HTML или JSON. Django берёт на себя многие задачи сайта из коробки: система авторизации пользователей, админка для контента, карты сайта, RSS. Он же помогает избежать частых ошибок безопасности, среди которых SQL-инъекции, межсайтовый скриптинг, подделка межсайтовых запросов и кликджекинг. Spring в Java построен вокруг IoC-контейнера: объекты приложения (бины) создаёт, связывает и обслуживает контейнер, а внедрение зависимостей в Spring считается частным случаем инверсии управления.

Фронтенд-фреймворки

Работают на стороне браузера и строят интерфейс из компонентов. Angular развивает команда в Google, и внутри уже есть маршрутизация, формы с валидацией, HTTP-клиент и внедрение зависимостей. Vue можно подключить к одной странице, а можно собрать на нём одностраничное приложение или сайт с серверным рендерингом, отсюда его прозвище «прогрессивный фреймворк».

Экран с интерфейсом веб-приложения из карточек и кнопок

Фулстек-фреймворки и микрофреймворки

Полноценный (full-stack) фреймворк даёт всё сразу: ORM, шаблоны, формы, авторизацию. Это Django, Ruby on Rails, Laravel. Микрофреймворк держит ядро маленьким. Во Flask по умолчанию нет слоя для работы с базой и проверки форм, их добавляют расширениями, и при этом сам Flask (не встроенный сервер) годится для продакшена. Express для Node.js минималистичен и не навязывает структуру.

Не только веб

Фреймворки для тестов работают по тому же принципу. Модуль unittest из стандартной библиотеки Python сам находит в классе методы, имена которых начинаются с test, и вызывает их. В pytest вы пишете функции test_..., а запускает их pytest.

Для мобильной разработки есть Flutter: одно приложение из общего кода для мобильных, веба и десктопа.

Язык Фреймворки Для чего
Python Django, Flask, FastAPI сайты и API
JavaScript, TypeScript Express, Next.js, Angular, Vue сервер на Node.js, веб-интерфейсы
Java Spring серверные приложения
PHP Laravel, Symfony сайты, API, консольные приложения
Ruby Ruby on Rails веб-приложения с базой данных
C# ASP.NET Core веб-приложения на Windows, Linux и macOS
Dart Flutter мобильные, веб- и десктопные приложения

Bootstrap в русской речи зовут CSS-фреймворком, хотя сам проект пишет о себе как о наборе инструментов для фронтенда. Это готовая сетка и компоненты вёрстки: кнопки, формы, меню.

React: библиотека или фреймворк

React описывает себя как библиотеку для пользовательских интерфейсов. По первому признаку он ведёт себя как фреймворк: функции-компоненты вызывает сам React, и его правила запрещают вызывать их вручную, как обычные функции. Библиотекой React остаётся по второму признаку: он не задаёт устройство приложения. Как устроены маршруты, загрузка данных и сборка проекта, React не решает. Поэтому новое приложение или сайт на React начинают с фреймворка: Next.js, React Router (v7), для мобильных приложений на React Native Expo.

За словами «проект на React» может стоять React внутри Next.js или похожего фреймворка. Сам React мы бы фреймворком не называли.

Два разработчика обсуждают интерфейс приложения у экрана

Фреймворк, CMS или разработка с нуля

CMS вроде WordPress даёт готовый продукт: сайт с админкой, страницами и плагинами работает сразу после установки. Фреймворк даёт детали и правила сборки, а сайт собираете вы. Разработка с нуля значит, что маршрутизацию и защиту вы пишете сами.

Подход Когда подходит Цена решения
CMS блог, сайт компании или небольшого бизнеса без сложной логики нестандартная логика упирается в плагины
Фреймворк интернет-магазин со своими правилами, личный кабинет, CRM, API для мобильного приложения нужен программист и время на старт
С нуля учебный проект или очень узкая задача всё, включая безопасность, на вас

Для блога или лендинга CMS разумнее: фреймворк тут даст только лишнюю работу. Вариант с фреймворком лучше, когда в проекте есть своя бизнес-логика, которую не описать настройками плагинов, или она появится в будущем. Собственный фреймворк для рабочего проекта писать не стоит: игрушечный пример выше полезен для понимания, но в нём нет ни защиты, ни тестов.

Зачем нужен фреймворк и чего он стоит

Код в команде получается единообразным, потому что все раскладывают его по одним правилам. Найденную уязвимость авторы фреймворка закрывают выпуском исправлений, и проекту достаточно обновиться.

Зато фреймворк приходится изучать: у Django больше частей и правил, чем у Flask, и на старт уходит больше времени. У фреймворка есть ограничения: гибкость меньше, чем у кода с нуля, и если задача не ложится в его модель, придётся бороться с ним. Мажорные версии могут ломать совместимость, поэтому проект приходится поддерживать и обновлять вслед за фреймворком.

Ноутбук с открытой документацией и стопка книг рядом

Как выбрать фреймворк для проекта

Выбор начинайте с языка и стека технологий, которые знает команда. Рейтинг популярности тут вторичен.

  1. Определите тип задачи: сайт с пользователями и админкой, API для мобильного приложения, интерфейс в браузере, мобильное приложение, тесты.
  2. Выберите размер. Если важна скорость разработки маленького сервиса или API, удобно начинать с микрофреймворка (Flask, FastAPI, Express). Сайт с авторизацией, формами и базой данных быстрее собрать на полноценном (Django, Laravel, Rails, Spring).
  3. Откройте документацию и попробуйте пройти официальный туториал за вечер. Если после него вы не сможете построить простую страницу, этот фреймворк сейчас не для вас.
  4. Узнайте, живой ли проект: дату последнего релиза, политику поддержки, открытые проблемы на GitHub. Например, у Django 5.2 LTS исправления безопасности выходят до апреля 2028 года.
  5. Посмотрите количество готовых решений для конкретных задач: расширения для оплаты и авторизации через соцсети.
  6. Подумайте о нагрузке. Если приложению нужно держать много одновременных и долгих соединений (чат, уведомления в реальном времени), смотрите на асинхронные фреймворки на стандарте ASGI. Асинхронная поддержка во Flask по производительности уступает фреймворкам, изначально построенным на async: каждый запрос и в async-функции занимает один обработчик.

Новичкам мы бы советовали такой порядок: сначала основы языка, затем микрофреймворк, где видно каждую деталь, и только потом полноценный фреймворк. Если начать сразу с Django, легко пропустить, откуда берутся запросы и почему функция работает, хотя её никто не вызывал.

Чашка кофе и блокнот со схемой рядом с клавиатурой

Когда фреймворк не нужен

Использовать фреймворк для скрипта на 50 строк смысла нет. Консольная утилита, разовая обработка файлов, парсер выгрузки решаются библиотеками. Здесь фреймворк добавит зависимости и структуру, которой нечего наполнять. Учебные задачи на алгоритмы тоже решают без него.

Что такое фреймворк вне программирования

Слово встречается и в других областях, поэтому поиск выдаёт смешанные ответы. Общий смысл тот же: готовая рамка с правилами, которую наполняют своим содержанием.

  • Scrum в управлении проектами описан как лёгкий фреймворк для команд, которые решают сложные задачи. Набор ролей, событий и артефактов задан, наполнение за командой.
  • В маркетинге и продуктовой работе фреймворком называют схему принятия решений. RICE оценивает задачи по четырём параметрам: охват (Reach), влияние (Impact), уверенность (Confidence) и трудозатраты (Effort), итог считается как охват × влияние × уверенность / трудозатраты.
  • .NET Framework от Microsoft служит платформой для создания и запуска Windows-приложений и веб-сервисов: среда выполнения CLR и библиотека классов. Новый код пишите на .NET.

Команда разработчиков у доски с карточками задач

Частые вопросы о фреймворках

Что такое фреймворк простыми словами?

Фреймворк даёт готовую основу программы с правилами, куда вы вписываете свой код. Фреймворк сам принимает запросы, запускает ваши функции и превращает их результат в ответ. Вы описываете только то, что отличает ваш проект от других.

Чем фреймворк отличается от библиотеки?

Двумя признаками: направлением вызова и тем, кто задаёт устройство приложения. Библиотеку вызывает ваш код, когда ему нужно. Фреймворк вызывает ваш код сам, в заранее определённых местах (это называется инверсией управления), и задаёт структуру проекта: где лежат маршруты, модели и шаблоны.

Что такое веб-фреймворк?

Фреймворк для создания веб-приложений и сайтов. Он берёт на себя маршрутизацию адресов, работу с HTTP-запросами, шаблоны страниц, сессии и часто доступ к базе данных. Примеры: Django и Flask в Python, Laravel в PHP, Spring в Java, Express в Node.js.

Чем микрофреймворк отличается от полноценного?

Микрофреймворк держит ядро маленьким и не навязывает базу данных, формы и прочее: их подключают расширениями. Полноценный фреймворк даёт всё это сразу. Flask относится к микрофреймворкам, Django к полноценным.

Какой фреймворк учить первым?

Тот, что относится к вашему языку. Для Python удобно начать с Flask: на нём хорошо видно, как запрос превращается в вызов функции. Если хотите больше готовых частей, дальше переходите на Django. Для фронтенда сначала разберитесь с JavaScript, а потом берите React вместе с Next.js или Vue.

Почему React называют фреймворком, если это библиотека?

Потому что новое приложение на React советуют начинать внутри фреймворка (Next.js, React Router или Expo), и название библиотеки переносят на весь проект. Компоненты React вызывает сам, но маршруты, загрузку данных и сборку проекта не задаёт, поэтому формально это библиотека.

Оцените статью
bestprogrammer.ru
Добавить комментарий