Содержание страницы
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.
Простой скрипт для тестирования CGI¶Simple 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 module, который настраивается простым способом. В конечном итоге все сводится к правильной установке
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-подобных системах путь к интерпретатору в shebang (
#!/usr/bin/env python) должен быть правильным. Эта строка вызывает/usr/bin/envдля поиска Python, но завершится ошибкой, если нет/usr/bin/env, или если Python не находится в пути веб-сервера. Если известно, где установлен Python, можно использовать полный путь. Командыwhereis pythonиtype -p pythonмогут помочь найти, где он установлен. Как только путь известен, можно изменить shebang соответствующим образом:#!/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 и SCGI¶FastCGI and SCGI
FastCGI и SCGI пытаются решить проблему производительности CGI иным способом. Вместо встраивания интерпретатора в веб-сервер они создают долгоживущие фоновые процессы. В веб-сервере по-прежнему есть модуль, который позволяет веб-серверу «общаться» с фоновым процессом. Поскольку фоновый процесс не зависит от сервера, он может быть написан на любом языке, включая Python. Языку просто нужна библиотека, обрабатывающая взаимодействие с веб-сервером.
Разница между FastCGI и SCGI очень мала, поскольку SCGI – это, по сути, просто «упрощённый FastCGI». Из-за ограниченной поддержки SCGI веб-серверами большинство людей вместо него используют FastCGI, который работает так же. Почти всё, что применимо к SCGI, применимо и к FastCGI, поэтому мы рассмотрим только последний.
В наши дни FastCGI никогда не используется напрямую. Так же, как и mod_python, он используется только для развертывания WSGI-приложений.
Настройка FastCGI¶Setting up FastCGI
Каждому веб-серверу требуется свой модуль.
Apache имеет как mod_fastcgi, так и mod_fcgid.
mod_fastcgiявляется оригинальным, но у него есть некоторые лицензионные проблемы, из-за которых он иногда считается несвободным.mod_fcgid– это меньшая совместимая альтернатива. Один из этих модулей должен быть загружен Apache.lighttpd поставляется со своим модулем FastCGI, а также с модулем SCGI.
После установки и настройки модуля вы можете проверить его с помощью следующего WSGI-приложения:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from cgi import escape
import sys, os
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>%s</th><td>%s</td></tr>' % (escape(k), escape(v))
yield '</table>'
WSGIServer(app).run()
Это простое WSGI-приложение, но сначала нужно установить flup, так как flup обрабатывает низкоуровневый доступ к FastCGI.
См. также
Существует документация по настройке Django с WSGI, большая часть которой может быть использована повторно для других фреймворков и библиотек, совместимых с 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 самостоятельно управляет рабочими процессами, что упрощает администрирование.
Отступление: WSGI¶Step 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
Пример: MoinMoin¶Case 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 %s!</h1></body></html>"
>>> print template % "Reader"
<html><body><h1>Hello Reader!</h1></body></html>
>>> from string import Template
>>> template = Template("<html><body><h1>Hello ${name}</h1></body></html>")
>>> print template.substitute(dict(name='Dinsdale'))
<html><body><h1>Hello Dinsdale!</h1></body></html>
Для генерации сложного 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, которые хранят данные объектов как строки в таблицах и связи между этими строками.) Прямое сохранение объектов имеет преимущество: почти все объекты могут быть сохранены простым способом, в отличие от реляционных баз данных, где некоторые объекты очень сложно представить.
Фреймворки часто дают подсказки о том, какой метод хранения данных выбрать. Обычно лучше придерживаться хранилища данных, рекомендованного фреймворком, если только приложение не имеет особых требований, которые лучше удовлетворяются альтернативным механизмом хранения.
См. также
Инструменты для сохранения данных перечисляют возможности сохранения данных в файловой системе. Некоторые из этих модулей являются частью стандартной библиотеки.
Программирование баз данных помогает выбрать метод сохранения данных.
SQLAlchemy, самый мощный ORM для Python, и Elixir, который упрощает использование SQLAlchemy.
SQLObject, ещё один популярный 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-каналы; следует искать их на сайтах проектов.