Обзор: сравнение 13 веб-фреймворков Python

Если вы разрабатываете веб-приложение и выбрали Python в качестве языка для его создания, это разумный шаг. Зрелость Python в разработке, надежные библиотеки и широкое распространение в реальном мире сделали его легкой задачей для веб-разработки.

Теперь самое сложное: выбрать одну из множества доступных веб-фреймворков Python. Дело не только в том, что число продолжает расти, но может быть трудно найти тот, который лучше всего подходит для вашего варианта использования. Если вы создаете быстрый и грязный REST API, вам не понадобится где-то рядом с водопроводом и проводкой, необходимыми для полноценного пользовательского приложения с логинами пользователей, проверками форм и обработкой загрузки.

Видео по теме: Создание простого веб-приложения с помощью Python и Flask

В этом обзоре мы рассмотрим 13 наиболее широко используемых веб-фреймворков Python. Мы отметим, какие типы веб-приложений лучше всего подходят для создания, и посмотрим, как они сочетаются друг с другом в этих шести областях:

Установка: насколько легко и просто настроить фреймворк - проекты, которые не требуют формальной установки (его можно просто добавить в существующий проект в качестве включенного модуля), требующие минимального шаблона для начала работы или поставляемые с каким-либо предварительно сконфигурированной установки получите дополнительные баллы.

Документация: почти каждый достойный проект Python имеет документацию, в которой описывается настройка, иллюстрируются основные варианты использования и предоставляются подробные сведения об API. Здесь мы даем более высокие оценки фреймворкам, которые показывают, как создать целое приложение в рамках учебного курса, включают общие рецепты или шаблоны проектирования, а также выходят за рамки служебного долга (например, предоставляя подробные сведения о том, как запустить framework под вариантом Python, например PyPy или IronPython).

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

Родные возможности: сколько батарей в комплекте? Более высокие баллы получают платформы, которые обеспечивают встроенную поддержку интернационализации, шаблонов HTML и уровня доступа к данным. Очки также относятся к фреймворкам, которые используют встроенную поддержку Python для асинхронных операций ввода-вывода.

Безопасность: платформы, которые обеспечивают собственные меры безопасности, такие как защита от подделки межсайтовых запросов (CSRF) и управление сеансами с использованием зашифрованных файлов cookie, получают более высокие оценки.

Масштабируемость: большинство фреймворков Python могут использовать такие проекты, как Gevent или Gunicorn, для масштабной работы. Здесь мы рассмотрим встроенные в платформу функции, которые способствуют масштабируемости, такие как кэширование вывода и фрагментов страницы.

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

Всего мы рассмотрим 13 фреймворков. Пять из них - CubicWeb, Django, Web2py, Weppy и Zope2 - используют подход «кухонной раковины», объединяя практически все функции, которые, как вы можете себе представить, необходимы для веб-приложения. Остальные восемь фреймворков - Bottle, CherryPy, Falcon, Flask, Pyramid, Tornado, Web.py и Wheezy.web - предлагают более минималистичный подход, торгуя большим объемом и полнотой для простоты и легкости.

Начнем с тяжеловесов.

Тяжелые веб-фреймворки Python

CubicWeb

CubicWeb позиционируется как «платформа семантических веб-приложений, которая поддерживает повторное использование и объектно-ориентированный дизайн». Это интригующая система - как заметил Рик Грехан, когда он смотрел на нее еще в 2011 году, - которая подчеркивает использование абстракций и многоразовых строительных блоков кода, называемых «кубами», но она может быть слишком абстрактной или своеобразной для некоторых разработчиков.

Кубы - это программные компоненты, которые содержат схему (модель данных), сущности (логика программирования) и представления. Собирая несколько кубов, каждый из которых выполняет свою задачу, вы можете составлять программные приложения, повторно используя свой собственный код и код других.

По своей сути CubicWeb предоставляет базовые каркасы, используемые каждым веб-приложением: «репозиторий» для подключений и хранения данных; «веб-движок» для базовых HTTP-запросов / ответов и действий CRUD; и схему для моделирования данных. Все это описано в определениях классов Python. Чтобы настроить экземпляры CubicWeb и управлять ими, вы работаете с помощью инструмента командной строки, аналогичного тому, который используется для Django.

CubicWeb, похоже, не использует встроенную в Python 3 асинхронную функциональность. Обходным способом включения async было бы использование модуля cubicweb.pyramid для использования инфраструктуры Pyramid в качестве веб-сервера и использование ответвления Pyramid, использующего асинхронные конструкции. Но что-то более простое пока кажется недосягаемым.

Для извлечения или управления постоянными данными в приложении CubicWeb вы используете язык запросов отношений (RQL), который использует неопределенно похожий на SQL синтаксис, но построен по образцу SparQL от W3C. Обоснование этого CubicWeb опять же - абстракция: RQL предоставляет сильно развязанный маршрут для взаимосвязи различных источников данных. Но поскольку он реализован, вручную создавая запросы в виде строк, он, вероятно, будет казаться устаревшим разработчикам, привыкшим к ORM.

Есть и другие препятствия для использования CubicWeb. Во-первых, установка может быть проблемой. Поскольку CubicWeb имеет множество зависимостей, лучше всего использовать их pip installдля получения всех. Возможно, вам также придется вручную настроить локальную среду. Это резко контрастирует с другими фреймворками, где pip installвсе, что требуется, - это запустить или удалить код фреймворка во вложенную папку другого проекта.

Другая потенциальная проблема - отсутствие собственного механизма шаблонов; создание HTML остается на усмотрение разработчика. Вы можете преодолеть это, используя стороннюю систему шаблонов, такую ​​как Jinja2, или выбрав куб, который предоставляет инструменты для веб-интерфейсов, например, для платформы Boostrap HTML.

Одна давняя проблема с CubicWeb - отсутствие поддержки Python 3 - была решена. По состоянию на июнь 2016 года и версии 3.23 в CubicWeb появилась поддержка Python 3, за исключением таких модулей, как Twisted, которые сами не полностью портированы.

Как и Web2py, CubicWeb называет свою длинную документацию «книгой». Требуется время, чтобы объяснить необычный подход CubicWeb, продемонстрировать, как создавать некоторые базовые приложения, включить ссылки на API и в целом сделать все возможное, чтобы быть конкретным.

Джанго

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

Видео по теме: Создание простого веб-сайта с помощью Django

После многих лет работы над версией 1.x, Django недавно сделал изменение версии слева от десятичной точки. Самым большим изменением в Django 2.0 является то, что фреймворк теперь работает только с Python 3.4 и выше. В идеале вы все равно должны использовать Python 3.x, поэтому единственная причина использовать ветвь Django 1.x - это если вы застряли на старой версии Python.

Ключевой частью привлекательности Django является скорость развертывания. Поскольку он включает в себя так много элементов, которые вам нужны для разработки обычного веб-приложения, вы можете быстро приступить к работе. Маршрутизация, парсинг URL, подключение к базе данных (включая ORM), проверка формы, защита от атак и создание шаблонов - все это встроено.

Вы найдете строительные блоки для наиболее распространенных сценариев веб-приложений. Например, управление пользователями есть на большинстве веб-сайтов, поэтому Django предлагает его как стандартный элемент. Вместо того, чтобы создавать свою собственную систему для отслеживания учетных записей пользователей, сеансов, паролей, входов / выходов, прав администратора и т. Д., Django изначально имеет эти функции. Их можно использовать как есть или расширить, чтобы охватить новые варианты использования с минимальным объемом работы.

zope.formlib 1. Ядро - BSD; некоторые компоненты LGPLv3. 2. Доступно через; устанавливается отдельно, но поддерживается в рамках проекта. 3. Доступно через стороннее расширение.
  CubicWeb Джанго Web2py Weppy Zope2
Лицензия LGPL BSD LGPLv3 BSD / LGPLv3 [1] Общественная лицензия Zope
Родная система шаблонов HTML да да да да да
Собственное ORM / управление данными да да да да да
Библиотека расширений да да да да да
Проверка формы да да да да Да [2]
Защита от подделки межсайтовых запросов да да да да да
Управление пользователями / доступ на основе ролей да да да да да
Поддержка Python 3 да да Нет да Нет
Миграция схем для моделей данных да да да да Нет
Кеширование ответов Нет да да да да
Поддержка интернационализации да да да да да
Встроенная поддержка WebSockets Нет № 3] да Нет Нет
Интерактивная среда разработки да Нет да Нет да

В Django есть разумные и безопасные настройки по умолчанию, которые помогают защитить ваше веб-приложение от атак. Когда вы помещаете переменную в шаблон страницы, например строку с HTML или JavaScript, содержимое не отображается буквально, если вы явно не обозначите экземпляр переменной как безопасный. Это само по себе сокращает многие распространенные проблемы межсайтового скриптинга. Если вы хотите выполнить проверку формы, вы можете использовать все, от простой защиты CSRF до полномасштабных механизмов проверки по каждому полю, которые возвращают подробную информацию об ошибках.

Такой богатый и широкий набор функций, как Django, был бы не очень хорош без надежной документации. Сайт документации Django подробно рассматривает каждый аспект фреймворка с разных сторон. Работа с Python 3 или другими разновидностями языка, обеспечение безопасности, реализация общих компонентов веб-приложений (таких как сеансы или разбиение на страницы), создание карт сайта - все это рассматривается. Также подробно описаны API-интерфейсы для каждого уровня приложения - модели, представления и шаблона.

Однако с большой мощностью приходит большая сложность. Приложения Django имеют репутацию сложных приложений с множеством движущихся частей. Даже простое приложение Django с парой маршрутов требует значительного количества настроек для запуска. Если ваша задача состоит только в том, чтобы настроить пару простых конечных точек REST, Django почти наверняка окажется излишним.

У Django тоже есть свои особенности. Например, шаблоны страниц не могут использовать вызываемые объекты. Пример: вы можете передать {{user.name}}как компонент в шаблоне, но не {{user.get_name()}}. Это один из способов, с помощью которого Django гарантирует, что шаблоны случайно не сделают неприятных вещей, но эти ограничения могут раздражать, если вы не готовы к ним. Хотя есть обходные пути, они, как правило, снижают производительность.

Ядро Django синхронно. Однако один из способов добавить асинхронное поведение - это проект Django Channels. Этот проект, официальное дополнение Django, добавляет в Django асинхронную обработку подключений и сокетов, сохраняя при этом идиомы программирования Django.

Web2py

В мире Ruby Ruby on Rails является де-факто веб-фреймворком. Профессор информатики Университета ДеПола Массимо Ди Пьерро был вдохновлен Rails на создание веб-фреймворка на Python, который также был прост в настройке и работе. Результат - Web2py.

Самая большая привлекательность Web2py - это встроенная среда разработки. Когда вы настраиваете экземпляр Web2py, вам предоставляется веб-интерфейс, по сути, онлайн-редактор приложений Python, в котором вы можете настраивать компоненты приложения. Обычно это означает создание моделей, представлений и контроллеров, каждый из которых описывается с помощью модулей Python или HTML-шаблонов. Несколько примеров приложений поставляются с Web2py из коробки. Вы можете разобрать их, чтобы посмотреть, как они работают, или использовать их в качестве начальных шаблонов для создания собственных приложений.

Разработчики обычно развертывают Web2py, просто загружая его исходный код и используя его. Но для менее технических пользователей Windows или MacOS создатели Web2py предлагают версии, которые по сути являются автономными серверами. Загрузите, распакуйте и запустите одну из этих версий, и у вас будет локальный веб-сервер со встроенной предварительно сконфигурированной копией Web2py. Это хороший способ начать создавать приложение Web2py, которое затем можно развернуть. в другом месте по мере необходимости.

Веб-интерфейс Web2py был построен с помощью Bootstrap 2.16.1, поэтому он удобен для глаз и в нем легко ориентироваться. Редактор в браузере не заменяет полноценную среду IDE, но он снабжен полезными вспомогательными средствами, такими как нумерация строк и подсветка синтаксиса Python (включая автоматический отступ). Также включен быстрый веб-интерфейс к оболочке Python, так что вы можете взаимодействовать с Web2py из командной строки, если это необходимо - хорошая уступка для экспертов.

Система абстракции данных, используемая в Web2py, работает немного иначе, чем ORM Django и другие ORM, вдохновленные ею (например, Peewee). Эти системы используют классы Python для определения моделей, а в Web2py вы используете функции-конструкторы, например, define_tableдля создания экземпляров моделей. Большинство этих различий, вероятно, будут раздражать только людей, которые уже имеют опыт работы с одним и начинают использовать другой; они примерно одинаково сложны для новичков. У вас вряд ли возникнут проблемы с подключением Web2py к поставщику данных, поскольку он взаимодействует практически со всеми существующими крупными базами данных.

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

Web2py предоставляет множество других компонентов профессионального уровня: функции интернационализации, несколько методологий кэширования, контроль доступа и авторизацию и даже интерфейсные эффекты (например, выбор даты в формах) через интегрированную поддержку jQuery и AJAX. Также включены хуки для внешнего и внутреннего промежуточного программного обеспечения, хотя вам не разрешается использовать промежуточное программное обеспечение для замены основных функций Web2py.

Одним из существенных ограничений Web2py является то, что он совместим только с Python 2.x. Во-первых, это означает, что Web2py не может использовать синтаксис async Python 3. Во-вторых, если вы полагаетесь на внешние библиотеки, эксклюзивные для Python 3, вам не повезло. Тем не менее, работа по обеспечению совместимости с Web2py Python 3 уже ведется, и на момент написания этой статьи она почти завершена.

Неудивительно, что документацию Web2py называют «книгой». Во-первых, он охватывает ошеломляющее количество материалов по Web2py, Python и средам развертывания, используемым для обоих. Во-вторых, он написан в очень доступном повествовательном стиле. В-третьих, в нем подробно рассказывается об общих сценариях создания приложений. Например, есть целая глава об использовании jQuery (в комплекте с Web2Py) для создания приложений AJAX.

Weppy

Weppy чувствует себя на полпути между минимальной простотой Flask и полнотой Django. Несмотря на то, что разработка приложения Weppy отличается простотой Flash, Weppy имеет множество функций, имеющихся в Django, таких как уровни данных и аутентификация. Таким образом, Weppy подходит для приложений, варьирующихся от очень простых до умеренно сложных.

На первый взгляд, код Weppy очень похож на код Flask или Bottle. Для запуска и запуска базового веб-сайта с одним маршрутом требуется несколько инструкций. Маршруты можно описывать с помощью декораторов функций (простой способ) или программно, а синтаксис для этого близок к Flask / Bottle. Шаблоны работают примерно так же, за исключением незначительных изменений в синтаксисе.

Weppy отличается от других фреймворков тем, что включает в себя некоторые функции, которые они включают только в качестве подключаемых модулей или надстроек. Например, ни у Flask, ни у Bottle нет встроенного ORM или системы управления данными. Weppy включает ORM, хотя и основанный на проекте pyDAL, а не на гораздо более популярном SQLAlchemy. Weppy даже поддерживает миграцию схем, которую Django поддерживает как часть своей ORM (кроме того, система миграции Django намного более автоматизирована). Хотя у Weppy есть механизм расширений, список официально одобренных надстроек крошечный, намного меньше, чем каталог расширений для Flask.

Более легкие фреймворки, такие как Weppy, часто используются для создания RESTful API, и Weppy поставляется с удобными функциями для этой цели. Поместите декоратор @service в маршрут, и данные, которые вы возвращаете, будут автоматически отформатированы в JSON или XML по вашему выбору.

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

Еще одна функция Weppy, которая обычно ассоциируется с более тяжелой структурой, - это поддержка интернационализации. Строки в шаблонах можно переводить в соответствии с файлами локали, предоставленными с приложением, которые представляют собой простые словари Python. Выбор языка также можно установить путем анализа запроса браузера (то есть HTTP-заголовка Accept-Language) или путем привязки перевода к определенному маршруту.

Документация Weppy похожа на сам фреймворк. Он чистый, читаемый и написан для использования людьми. Помимо обычного примера приложения «hello world», оно включает в себя хорошее пошаговое руководство, которое позволяет вам создать систему микроблогов в качестве начального проекта.

В долгосрочные планы Weppy входит поддержка async и сокетов как низкоуровневых первоклассных сущностей. Разработчики Weppy планируют представить эти функции в версии 2.0, а затем потребовать Python 3.7 или выше для всех будущих версий Weppy.

Оценочная карта Собственные возможности (20%) Менеджмент (20%) Установка (20%) Документация (20%) Безопасность (10%) Масштабируемость (10%) Общий балл (100%)
Бутылка 0,12 8 10 10 8 7 7 8,6
CherryPy 17.0.0 7 9 9 9 8 8 8,4
CubicWeb 3.26.4 10 8 7 10 9 7 8,6
Django 2.1 10 8 8 10 10 10 9.2
Сокол 1.4.1 7 10 8 8 7 7 8.0
Фляга 1.0.2 8 9 8 9 8 8 8,4
Пирамида 1.9.2 8 8 8 10 9 7 8,4
Торнадо 4.3 8 9 9 8 8 7 8,3
Web.py 0,39 8 8 10 8 9 8 8,5
Web2py 2.16.1 10 9 7 10 9 8 8.9
Weppy 1.2.11 10 8 9 9 10 9 9.1
Wheezy.web 0.1.485 9 9 8 8 8 8 8,4
Zope2 2.13.24 10 8 7 9 9 9 8,6