Документация Python неофициальный перевод
Содержание страницы

HOWTO Использование Python в вебеHOWTO Use Python in the web

Автор:Marek Kubica

Аннотация

В этом документе показано, как Python вписывается в веб. В нём представлены некоторые способы интеграции Python с веб-сервером и общие практики, полезные для разработки веб-сайтов.

Программирование для веба стало горячей темой с появлением «Веб 2.0», которая сосредоточена на пользовательском контенте на веб-сайтах. Всегда было возможно использовать Python для создания веб-сайтов, но это была довольно утомительная задача. Поэтому было создано множество фреймворков и вспомогательных инструментов, чтобы помочь разработчикам создавать более быстрые и надёжные сайты. В данном HOWTO описываются некоторые методы комбинирования Python с веб-сервером для создания динамического контента. Он не предназначен для полного введения, так как эта тема слишком широка, чтобы быть охваченной в одном документе. Однако предоставлен краткий обзор наиболее популярных библиотек.

См. также

Хотя данный HOWTO пытается дать обзор использования Python в вебе, он не может всегда быть настолько актуальным, как хотелось бы. Разработка веб-приложений на Python быстро развивается, поэтому страница вики по теме Web Programming может быть более синхронизирована с последними разработками.

Низкоуровневый обзорThe Low-Level View

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

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

Большинство HTTP-серверов написаны на C или C++, поэтому они не могут напрямую выполнять код Python – необходим мост между сервером и программой. Эти мосты, вернее интерфейсы, определяют, как программы взаимодействуют с сервером. Было множество попыток создать наилучший возможный интерфейс, но лишь немногие заслуживают упоминания.

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

Общий шлюзовой интерфейсCommon Gateway Interface

Этот интерфейс, чаще всего называемый «CGI», является старейшим и поддерживается почти каждым веб-сервером «из коробки». Программы, использующие CGI для взаимодействия со своим веб-сервером, должны запускаться сервером для каждого запроса. Таким образом, каждый запрос запускает новый интерпретатор Python – что требует некоторого времени на запуск – поэтому весь интерфейс пригоден только для ситуаций с низкой нагрузкой.

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

Написание CGI-программ хотя и возможно, но больше не рекомендуется. С WSGI, тема которого рассматривается далее в этом документе, можно писать программы, эмулирующие CGI, чтобы их можно было запускать как CGI, если нет лучшего варианта.

См. также

Стандартная библиотека Python включает несколько модулей, полезных для создания простых CGI-программ:

  • cgi – Обработка пользовательского ввода в CGI-скриптах
  • cgitb – Отображает красивые трассировки при возникновении ошибок в CGI- приложениях, вместо показа сообщения «500 Internal Server Error»

Вики-сайт Python содержит страницу о CGI-скриптах с дополнительной информацией о CGI в Python.

Простой скрипт для тестирования CGISimple script for testing CGI

Чтобы проверить, работает ли ваш веб-сервер с CGI, можно использовать эту короткую и простую CGI-программу:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

# включить отладку
import cgitb
cgitb.enable()

print("Content-Type: text/plain;charset=utf-8")
print()

print("Hello World!")

В зависимости от конфигурации вашего веб-сервера может потребоваться сохранить этот код с расширением .py или .cgi. Кроме того, для безопасности этот файл также может находиться в папке cgi-bin.

Возможно, вы задаётесь вопросом, что означает строка с cgitb. Эта строка позволяет отображать красивую трассировку вместо простого сбоя и показа сообщения «Internal Server Error» в браузере пользователя. Это полезно для отладки, но может привести к раскрытию некоторых конфиденциальных данных пользователю. По этой причине не следует использовать cgitb в рабочем коде. Следует всегда перехватывать исключения и отображать подходящие страницы ошибок – конечные пользователи не любят видеть непонятные «Internal Server Errors» в своих браузерах.

Настройка CGI на собственном сервереSetting up CGI on your own server

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

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

  • В Apache можно посмотреть руководство Dynamic Content with CGI, где всё описано. В большинстве случаев достаточно просто установить +ExecCGI. Это руководство также описывает наиболее распространённые ловушки, которые могут возникнуть.
  • На lighttpd нужно использовать модуль CGI, который настраивается простым способом. Всё сводится к правильной установке cgi.assign.

Распространённые проблемы с CGI-скриптамиCommon problems with CGI scripts

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

Некоторые из этих потенциальных проблем:

  • Скрипт Python не помечен как исполняемый. Если CGI-скрипты не исполняемы, большинство веб-серверов позволят пользователю скачать его, вместо запуска и отправки вывода пользователю. Чтобы CGI-скрипты работали правильно в Unix-подобных операционных системах, необходимо установить бит +x. Использование chmod a+x your_script.py может решить эту проблему.
  • В Unix-подобных системах окончания строк в файле программы должны быть в стиле Unix. Это важно, потому что веб-сервер проверяет первую строку скрипта (так называемый шебанг) и пытается запустить указанную там программу. Он легко путается с окончаниями строк Windows (возврат каретки и перевод строки, также называемые CRLF), поэтому необходимо преобразовать файл в окончания строк Unix (только перевод строки, LF). Это можно сделать автоматически, загружая файл через FTP в текстовом режиме, а не в двоичном, но предпочтительный способ – указать редактору сохранять файлы с окончаниями строк Unix. Большинство редакторов это поддерживают.
  • Веб-сервер должен иметь возможность читать файл, и необходимо убедиться, что права доступа установлены правильно. В Unix-подобных системах сервер часто работает от пользователя и группы www-data, поэтому стоит попробовать изменить владельца файла или сделать файл общедоступным для чтения с помощью chmod a+r your_script.py.
  • Веб-сервер должен знать, что файл, к которому вы пытаетесь получить доступ, является CGI-скриптом. Проверьте конфигурацию вашего веб-сервера: возможно, он настроен на ожидание определённого расширения файла для CGI-скриптов.
  • В Unix-подобных системах путь к интерпретатору в шебанге (#!/usr/bin/env python) должен быть правильным. Эта строка вызывает /usr/bin/env для поиска Python, но это не удастся, если нет /usr/bin/env, или если Python отсутствует в пути веб-сервера. Если вы знаете, где установлен ваш Python, вы можете использовать полный путь. Команды whereis python и type -p python помогут найти его. Как только вы узнаете путь, вы можете соответствующим образом изменить шебанг: #!/usr/bin/python.
  • Файл не должен содержать BOM (метку порядка байтов). BOM предназначен для определения порядка байтов в кодировках UTF-16 и UTF-32, но некоторые редакторы записывают его также в UTF-8 файлы. BOM мешает работе строки шебанга, поэтому убедитесь, что ваш редактор не записывает BOM.
  • Если веб-сервер использует mod_python, mod_python может испытывать проблемы. mod_python способен самостоятельно обрабатывать CGI-скрипты, но также может быть источником проблем.

mod_python

Люди, пришедшие с PHP, часто с трудом понимают, как использовать Python в вебе. Их первой мыслью обычно становится mod_python, потому что они думают, что это аналог mod_php. На самом деле между ними много различий. mod_python встраивает интерпретатор в процесс Apache, ускоряя обработку запросов за счёт того, что не нужно запускать интерпретатор Python для каждого запроса. С другой стороны, это не «Python, смешанный с HTML» в том смысле, как PHP часто смешивают с HTML. Эквивалент этого в Python – шаблонизатор. Сам по себе mod_python гораздо мощнее и предоставляет больше доступа к внутренним механизмам Apache. Он может эмулировать CGI, работать в режиме «Python Server Pages» (аналог JSP), который представляет собой «HTML, перемешанный с Python», а также имеет «Publisher», который назначает один файл для приёма всех запросов и принятия решения о том, что с ними делать.

У mod_python действительно есть некоторые проблемы. В отличие от интерпретатора PHP, интерпретатор Python использует кэширование при выполнении файлов, поэтому изменения в файле потребуют перезапуска веб-сервера. Другая проблема – базовая концепция: Apache запускает дочерние процессы для обработки запросов, и, к сожалению, каждый дочерний процесс должен загружать весь интерпретатор Python, даже если он его не использует. Это замедляет весь веб-сервер. Ещё одна проблема заключается в том, что поскольку mod_python связан с конкретной версией libpython, невозможно перейти со старой версии на новую (например, с 2.4 на 2.5) без перекомпиляции mod_python. mod_python также привязан к веб-серверу Apache, поэтому программы, написанные для mod_python, не могут легко работать на других веб-серверах.

Вот причины, по которым следует избегать mod_python при написании новых программ. В некоторых обстоятельствах всё же может быть хорошей идеей использовать mod_python для развёртывания, но WSGI позволяет запускать WSGI-программы также и под mod_python.

FastCGI и SCGIFastCGI and SCGI

FastCGI и SCGI пытаются решить проблему производительности CGI иным способом. Вместо встраивания интерпретатора в веб-сервер они создают долгоживущие фоновые процессы. В веб-сервере по-прежнему есть модуль, который позволяет веб-серверу «общаться» с фоновым процессом. Поскольку фоновый процесс не зависит от сервера, он может быть написан на любом языке, включая Python. Языку просто нужна библиотека, обрабатывающая взаимодействие с веб-сервером.

Разница между FastCGI и SCGI очень мала, поскольку SCGI – это, по сути, просто «упрощённый FastCGI». Из-за ограниченной поддержки SCGI веб-серверами большинство людей вместо него используют FastCGI, который работает так же. Почти всё, что применимо к SCGI, применимо и к FastCGI, поэтому мы рассмотрим только последний.

В наши дни FastCGI никогда не используется напрямую. Как и mod_python, он используется только для развёртывания WSGI-приложений.

См. также

Настройка FastCGISetting up FastCGI

Каждому веб-серверу требуется свой модуль.

  • В Apache есть как mod_fastcgi, так и mod_fcgid. mod_fastcgi – оригинальный модуль, но у него есть некоторые проблемы с лицензированием, из-за чего его иногда считают несвободным. mod_fcgid – меньшая, совместимая альтернатива. Один из этих модулей должен быть загружен Apache.
  • lighttpd поставляется со своим модулем FastCGI, а также с модулем SCGI.
  • nginx также поддерживает FastCGI.

После установки и настройки модуля вы можете проверить его с помощью следующего WSGI-приложения:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import sys, os
from cgi import escape
from flup.server.fcgi import WSGIServer

def app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])

    yield '<h1>FastCGI Environment</h1>'
    yield '<table>'
    for k, v in sorted(environ.items()):
         yield '<tr><th>{0}</th><td>{1}</td></tr>'.format(
             escape(k), escape(v))
    yield '</table>'

WSGIServer(app).run()

Это простое WSGI-приложение, но сначала нужно установить flup, так как flup обрабатывает низкоуровневый доступ к FastCGI.

См. также

Существует документация по настройке Django с FastCGI, большая часть которой может быть повторно использована для других WSGI-совместимых фреймворков и библиотек. Нужно изменить только часть, связанную с manage.py; вместо неё можно использовать приведённый здесь пример. Django делает примерно то же самое.

mod_wsgi

mod_wsgi – это попытка избавиться от низкоуровневых шлюзов. Учитывая, что FastCGI, SCGI и mod_python в основном используются для развёртывания WSGI-приложений, mod_wsgi был создан для прямого встраивания WSGI-приложений в веб-сервер Apache. mod_wsgi специально разработан для размещения WSGI-приложений. Он делает развёртывание WSGI-приложений намного проще, чем развёртывание с использованием других низкоуровневых методов, требующих связующего кода. Недостаток в том, что mod_wsgi ограничен веб-сервером Apache; другим серверам потребуются собственные реализации mod_wsgi.

mod_wsgi поддерживает два режима: встроенный режим, при котором он интегрируется с процессом Apache, и режим демона, который больше похож на FastCGI. В отличие от FastCGI, mod_wsgi самостоятельно управляет рабочими процессами, что упрощает администрирование.

Отступление: WSGIStep back: WSGI

WSGI уже упоминалось несколько раз, так что это, должно быть, что-то важное. На самом деле так и есть, и теперь настало время объяснить, что это такое.

Web Server Gateway Interface (сокращённо WSGI) определён в PEP 333 и в настоящее время является лучшим способом веб-программирования на Python. Хотя он отлично подходит для программистов, пишущих фреймворки, обычному веб-разработчику не нужно напрямую с ним сталкиваться. При выборе фреймворка для веб-разработки стоит выбрать тот, который поддерживает WSGI.

Большое преимущество WSGI – унификация интерфейса прикладного программирования. Если ваша программа совместима с WSGI (что на внешнем уровне означает, что используемый вами фреймворк поддерживает WSGI), её можно развернуть через любой веб-серверный интерфейс, для которого существуют WSGI-обёртки. Вам не нужно заботиться о том, использует ли пользователь приложения mod_python, FastCGI или mod_wsgi – с WSGI ваше приложение будет работать на любом шлюзовом интерфейсе. Стандартная библиотека Python содержит собственный WSGI-сервер, wsgiref, который представляет собой небольшой веб-сервер, пригодный для тестирования.

Очень полезная возможность WSGI – промежуточное ПО (middleware). Middleware – это слой вокруг вашей программы, который может добавлять ей различные функции. Уже доступно довольно много middleware. Например, вместо того чтобы писать собственное управление сессиями (HTTP – протокол без состояния, поэтому для связывания нескольких HTTP-запросов с одним пользователем ваше приложение должно создавать и управлять таким состоянием через сессию), вы можете просто скачать middleware, которое это делает, подключить его и заниматься кодированием уникальных частей вашего приложения. То же самое с сжатием: существует готовое middleware, которое сжимает ваш HTML с помощью gzip, экономя пропускную способность сервера. Аутентификация – ещё одна проблема, легко решаемая с помощью существующего middleware.

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

WSGI-серверыWSGI Servers

Код, используемый для подключения к различным низкоуровневым шлюзам, таким как CGI или mod_python, называется WSGI-сервером. Один из таких серверов – flup, который поддерживает FastCGI и SCGI, а также AJP. Некоторые из этих серверов написаны на Python, как и flup, но существуют и другие, написанные на C, которые можно использовать в качестве замены без доработок.

Уже существует множество серверов, поэтому веб-приложение на Python можно развернуть практически где угодно. Это одно из главных преимуществ Python перед другими веб-технологиями.

См. также

Хороший обзор кода, связанного с WSGI, можно найти в вики WSGI, где содержится обширный список серверов WSGI, которые могут использоваться любым приложением, поддерживающим WSGI.

Возможно, вам будут интересны некоторые модули, поддерживающие WSGI, уже входящие в стандартную библиотеку, а именно:

  • wsgiref – небольшие утилиты и серверы для WSGI

Пример: MoinMoinCase study: MoinMoin

Что даёт WSGI разработчику веб-приложений? Давайте взглянем на приложение, которое существует уже некоторое время и было написано на Python без использования WSGI.

Один из самых популярных пакетов вики-программного обеспечения – MoinMoin. Он был создан в 2000 году, то есть примерно на три года раньше WSGI. В старых версиях требовался отдельный код для работы с CGI, mod_python, FastCGI и в автономном режиме.

Теперь он включает поддержку WSGI. Благодаря WSGI MoinMoin можно развернуть на любом сервере, совместимом с WSGI, без дополнительного склеивающего кода. В отличие от версий до WSGI, это могут быть WSGI-серверы, о которых авторы MoinMoin даже не знают.

Модель-Представление-КонтроллерModel-View-Controller

Термин MVC часто встречается в утверждениях вроде «фреймворк foo поддерживает MVC». MVC – это скорее общая организация кода, а не конкретный API. Многие веб-фреймворки используют эту модель, чтобы помочь разработчику структурировать программу. Крупные веб-приложения могут содержать много кода, поэтому хорошей идеей будет заложить эффективную структуру с самого начала. Так даже пользователи других фреймворков (или даже других языков, поскольку MVC не специфичен для Python) смогут легко понять код, если они уже знакомы со структурой MVC.

MVC расшифровывается как три компонента:

  • Модель (model). Это данные, которые будут отображаться и изменяться. В фреймворках Python этот компонент часто представлен классами, используемыми объектно-реляционным маппером (ORM).
  • Представление (view). Задача этого компонента – отображать данные модели пользователю. Обычно этот компонент реализуется с помощью шаблонов.
  • Контроллер (controller). Это прослойка между пользователем и моделью. Контроллер реагирует на действия пользователя (например, открытие определённого URL), сообщает модели при необходимости изменить данные и указывает коду представления, что отображать.

Хотя можно подумать, что MVC – это сложный шаблон проектирования, на самом деле это не так. Он используется в Python, потому что оказался полезным для создания чистых и поддерживаемых веб-сайтов.

Примечание

Хотя не все фреймворки Python явно поддерживают MVC, часто тривиально создать веб-сайт, использующий шаблон MVC, разделяя логику данных (модель), логику взаимодействия с пользователем (контроллер) и шаблоны (представление). Вот почему важно не писать лишний код Python в шаблонах – это противоречит модели MVC и создаёт хаос в кодовой базе, усложняя её понимание и модификацию.

См. также

В английской Википедии есть статья о шаблоне Model-View-Controller. В ней представлен длинный список веб-фреймворков для различных языков программирования.

Ингредиенты для веб-сайтовIngredients for Websites

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

См. также

Компонентов гораздо больше, чем можно представить здесь. В вики-разделе Python есть страница об этих компонентах под названием Web Components.

ШаблоныTemplates

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

Python уже включает способ создания простых шаблонов:

# простой шаблон
template = "<html><body><h1>Hello {who}!</h1></body></html>"
print(template.format(who="Reader"))

Для генерации сложного HTML на основе нетривиальных данных модели обычно требуются условные конструкции и циклы, такие как for и if в Python. Шаблонизаторы (template engines) поддерживают шаблоны такой сложности.

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

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

Популярные шаблонизаторы включают:

См. также

Существует множество шаблонизаторов, борющихся за внимание, потому что создать их на Python довольно легко. Страница Templating в вики содержит большой и постоянно растущий их список. Три перечисленных выше считаются шаблонизаторами «второго поколения» и являются хорошей отправной точкой.

Сохранение данныхData persistence

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

Часто используются реляционные базы данных, такие как MySQL или PostgreSQL, из-за их высокой производительности при работе с очень большими базами данных, содержащими миллионы записей. Также существует небольшая база данных SQLite, которая поставляется вместе с Python в модуле sqlite3 и использует всего один файл. У неё нет других зависимостей. Для небольших сайтов SQLite вполне достаточно.

Relational databases are queried using a language called SQL. Python programmers in general do not like SQL too much, as they prefer to work with objects. It is possible to save Python objects into a database using a technology called ORM (Object Relational Mapping). ORM translates all object-oriented access into SQL code under the hood, so the developer does not need to think about it. Most frameworks use ORMs, and it works quite well.

Второй вариант – хранение данных в обычных текстовых файлах (иногда называемых «плоскими файлами»). Для простых сайтов это очень просто, но может оказаться сложным, если веб-сайт выполняет множество обновлений хранящихся данных.

Третий вариант – объектно-ориентированные базы данных (также называемые «объектными базами данных»). Они хранят данные объектов в форме, близкой к тому, как объекты структурированы в памяти во время выполнения программы. (В отличие от ORM, которые хранят данные объектов как строки в таблицах и связи между этими строками.) Прямое сохранение объектов имеет преимущество: почти все объекты могут быть сохранены простым способом, в отличие от реляционных баз данных, где некоторые объекты очень сложно представить.

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

См. также

ФреймворкиFrameworks

Процесс создания кода для работы веб-сайтов включает написание кода, предоставляющего различные сервисы. Код для конкретного сервиса часто работает одинаково независимо от сложности или назначения веб-сайта. Абстрагирование этих общих решений в многократно используемый код приводит к тому, что называется «фреймворками» для веб-разработки. Пожалуй, самый известный фреймворк для веб-разработки – Ruby on Rails, но у Python есть свои фреймворки. Некоторые из них частично вдохновлены Rails или позаимствовали идеи у Rails, но многие существовали задолго до Rails.

Изначально веб-фреймворки Python стремились включать все сервисы, необходимые для разработки веб-сайтов, в виде единого гигантского набора инструментов. Никакие два веб-фреймворка не были совместимы: программу, разработанную для одного, нельзя было развернуть на другом без значительных переработок. Это привело к созданию «минималистичных» веб-фреймворков, которые предоставляли только инструменты для взаимодействия между кодом Python и протоколом HTTP, а все остальные сервисы добавлялись сверху через отдельные компоненты. Были разработаны некоторые ad hoc стандарты, обеспечивающие ограниченную совместимость между фреймворками, например стандарт, позволяющий взаимозаменяемо использовать разные шаблонизаторы.

С появлением WSGI мир веб-фреймворков Python развивается в направлении совместимости на основе стандарта WSGI. Теперь многие веб-фреймворки, будь то «полностековые» (предоставляющие все инструменты, необходимые для развертывания самых сложных веб-сайтов) или минималистичные, или что-то среднее, строятся из коллекций многократно используемых компонентов, которые можно использовать с более чем одним фреймворком.

Большинство пользователей, вероятно, захотят выбрать «полностековый» фреймворк с активным сообществом. Такие фреймворки, как правило, хорошо документированы и предоставляют самый простой путь к созданию полностью функционального веб-сайта за минимальное время.

Некоторые известные фреймворкиSome notable frameworks

Существует невероятное количество фреймворков, поэтому здесь невозможно охватить их все. Вместо этого мы кратко рассмотрим некоторые из самых популярных.

Django

Django – это фреймворк, состоящий из нескольких тесно связанных элементов, которые были написаны с нуля и отлично работают вместе. Он включает ORM, который довольно мощный и при этом прост в использовании, а также отличный веб-интерфейс администратора, позволяющий редактировать данные в базе данных через браузер. Шаблонизатор основан на тексте и спроектирован так, чтобы его могли использовать дизайнеры страниц, не умеющие писать на Python. Он поддерживает наследование шаблонов и фильтры (работающие как каналы Unix). Django включает множество удобных функций, таких как создание RSS-лент или общие представления (generic views), что позволяет создавать веб-сайты почти без написания кода на Python.

У него большое международное сообщество, участники которого создали множество веб-сайтов. Также существует много дополнительных проектов, расширяющих стандартную функциональность Django. Это частично объясняется хорошо написанной онлайн-документацией Django и книгой по Django.

Примечание

Хотя Django является фреймворком в стиле MVC, он называет элементы по-другому, что описано в Django FAQ.

TurboGears

Ещё один популярный веб-фреймворк для Python – TurboGears. TurboGears использует подход, заключающийся в применении уже существующих компонентов и их объединении с помощью склеивающего кода для создания бесшовного опыта. TurboGears предоставляет пользователю гибкость в выборе компонентов. Например, ORM и шаблонизатор можно заменить на пакеты, отличные от используемых по умолчанию.

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

Новейшая версия TurboGears, версия 2.0, делает ещё один шаг в направлении поддержки WSGI и компонентной архитектуры. TurboGears 2 основан на стеке WSGI другого популярного веб-фреймворка с компонентной архитектурой – Pylons.

Zope

Фреймворк Zope – один из «старых оригинальных» фреймворков. Его текущее воплощение, Zope2, представляет собой тесно интегрированный полностековой фреймворк. Одна из его самых интересных особенностей – тесная интеграция с мощной объектной базой данных ZODB (Zope Object Database). Из-за своей высокой интегрированности Zope оказался в несколько изолированной экосистеме: код, написанный для Zope, был не очень пригоден для использования вне Zope, и наоборот. Для решения этой проблемы был начат проект Zope 3. Zope 3 перепроектирует Zope как набор более чистых изолированных компонентов. Этот проект был начат до появления стандарта WSGI, но поддержка WSGI для Zope 3 есть от проекта Repoze. Компоненты Zope имеют за плечами много лет промышленного использования, и проект Zope 3 предоставляет доступ к этим компонентам более широкому сообществу Python. Существует даже отдельный фреймворк на основе компонентов Zope: Grok.

Zope также является инфраструктурой, используемой системой управления контентом Plone, одной из самых мощных и популярных доступных систем управления контентом.

Другие известные фреймворкиOther notable frameworks

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

Еще один уже упомянутый фреймворк – Pylons. Pylons во многом похож на TurboGears, но с ещё большим акцентом на гибкость, что достигается ценой более сложного использования. Почти любой компонент можно заменить, из-за чего приходится обращаться к документации каждого отдельного компонента, а их много. Pylons построен на Paste – обширном наборе инструментов, полезных для WSGI.

И это ещё не всё. Самую актуальную информацию всегда можно найти в вики Python.

См. также

В вики Python есть обширный список веб-фреймворков.

Большинство фреймворков также имеют собственные списки рассылки и IRC-каналы; ищите их на веб-сайтах проектов. Также есть общий IRC-канал «Python in the Web» на freenode под названием #python.web.