Содержание страницы
HOWTO Использование Python в вебе¶HOWTO Use Python in the web
| Автор: | Marek Kubica |
|---|
Аннотация
В этом документе показано, как Python вписывается в веб. Представлены некоторые способы интеграции Python с веб-сервером и общие практики, полезные для разработки веб-сайтов.
Программирование для веба стало горячей темой с подъёмом «Веб 2.0», который фокусируется на пользовательском контенте на веб-сайтах. Использовать Python для создания веб-сайтов всегда было возможно, но это была довольно утомительная задача. Поэтому было создано множество так называемых «фреймворков» и вспомогательных инструментов, чтобы помочь разработчикам создавать сайты быстрее и делать их более надёжными. Этот HOWTO описывает некоторые методы, используемые для объединения Python с веб-сервером для создания динамического контента. Он не задуман как общее введение, так как эта тема слишком широка, чтобы охватить её в одном документе. Тем не менее, даётся краткий обзор наиболее популярных библиотек.
См. также
Хотя этот HOWTO пытается дать обзор Python в вебе, он не всегда может быть таким актуальным, как хотелось бы. Разработка веб-приложений на Python быстро развивается, поэтому вики-страница Веб-программирование может быть более синхронизирована с последними изменениями.
Низкоуровневый взгляд¶The low-level view
Когда пользователь заходит на веб-сайт, его браузер устанавливает соединение с веб-сервером (это называется запрос). Сервер находит файл в файловой системе и отправляет его обратно в браузер пользователя, который отображает его (это ответ). Примерно так работает лежащий в основе протокол HTTP.
Динамические веб-сайты – это не файлы в файловой системе, а программы, которые запускаются веб-сервером при поступлении запроса. Они могут делать много полезных вещей: отображать сообщения на доске объявлений, показывать почту, настраивать программное обеспечение или просто показывать текущее время. Такие программы можно писать практически на любом языке программирования, который поддерживает сервер, поэтому Python легко использовать для создания динамических веб-сайтов.
Поскольку большинство HTTP-серверов написаны на C или C++, они не могут просто выполнять код Python – нужен мост между сервером и программой. Эти мосты, или, скорее, интерфейсы, определяют, как программы взаимодействуют с сервером. В прошлом было много попыток создать наилучший интерфейс, но упомянуть стоит лишь некоторые.
Не каждый веб-сервер поддерживает все интерфейсы. Многие веб-серверы поддерживают только старые, уже устаревшие интерфейсы. Но их часто можно расширить с помощью сторонних модулей для поддержки новых.
Общий шлюзовой интерфейс¶Common Gateway Interface
Этот интерфейс – самый старый, он поддерживается практически каждым веб-сервером из коробки. Программы, использующие CGI для связи с сервером, должны запускаться сервером для каждого запроса. Таким образом, каждый запрос запускает новый интерпретатор Python, что требует времени на запуск, из-за чего этот интерфейс пригоден только для ситуаций с низкой нагрузкой.
Плюс CGI – простота: написать программу, использующую 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» в браузере пользователя. Это полезно для отладки, но может привести к утечке конфиденциальных данных пользователю. Не используйте её, когда скрипт готов к эксплуатации. Тем не менее, следует всегда перехватывать исключения и показывать нормальные страницы ошибок – конечные пользователи не любят видеть в браузере непонятные «Internal Server Error».
Настройка CGI на собственном сервере¶Setting up CGI on your own server
Если у вас нет собственного веб-сервера, это к вам не относится. Вы можете проверить, работает ли он как есть, а если нет, вам в любом случае нужно поговорить с администратором вашего веб-сервера. Если это крупный хостинг-провайдер, можно попробовать создать тикет с запросом поддержки Python.
Если вы сами являетесь администратором или хотите установить его для тестирования на своих компьютерах, вам придётся настраивать его самостоятельно. Не существует единого способа настройки CGI, так как есть много веб-серверов с разными параметрами конфигурации. Самый популярный на данный момент свободный веб-сервер – Apache HTTPd, сокращённо Apache; его используют большинство людей, и его можно легко установить почти в любой системе с помощью системного менеджера пакетов. Но lighttpd уже некоторое время привлекает внимание и, как говорят, имеет лучшую производительность. На многих системах этот сервер также можно установить через менеджер пакетов, так что ручная компиляция веб-сервера никогда не требуется.
- В Apache можно обратиться к руководству Dynamic Content with CGI, где всё описано. В большинстве случаев достаточно просто установить +ExecCGI. В руководстве также описаны наиболее распространённые подводные камни.
- На lighttpd нужно использовать модуль CGI, который настраивается прямолинейно. Всё сводится к правильной настройке cgi.assign.
Распространённые проблемы с CGI-скриптами¶Common problems with CGI scripts
Попытки использовать CGI иногда приводят к небольшим неприятностям, которые могут возникнуть при попытке заставить эти скрипты работать. Иногда случается, что, казалось бы, правильный скрипт не работает должным образом из-за какой-то мелкой скрытой причины, которую трудно заметить.
Некоторые из этих причин:
- Скрипт Python не помечен как исполняемый. Если CGI-скрипты не исполняемы, большинство веб-серверов позволят пользователю скачать его, а не запустить и отправить вывод. Чтобы CGI-скрипты работали корректно, должен быть установлен бит +x. Использование chmod a+x your_script.py может уже решить проблему.
- Концы строк должны быть в стиле Unix. Это важно, потому что веб-сервер проверяет первую строку скрипта (так называемый shebang) и пытается запустить программу, указанную там. Он легко сбивается с толку от окончаний строк Windows (Carriage Return & Line Feed, также называемые CRLF), поэтому нужно преобразовать файл в окончания строк Unix (только Line Feed, LF). Это можно сделать автоматически при загрузке файла через FTP в текстовом режиме вместо двоичного, но предпочтительный способ – просто указать редактору сохранять файлы с окончаниями строк Unix. Большинство приличных редакторов это поддерживают.
- Ваш веб-сервер должен иметь возможность читать файл, нужно убедиться, что права доступа в порядке. Часто сервер работает от пользователя и группы www-data, поэтому стоит попробовать изменить владельца файла или сделать его читаемым для всех с помощью chmod a+r your_script.py.
- Веб-сервер должен знать, что файл, к которому вы обращаетесь, является CGI-скриптом. Проверьте конфигурацию вашего веб-сервера, возможно, есть какая-то ошибка.
- Путь к интерпретатору в shebang (#!/usr/bin/env python) должен быть правильным. Эта строка вызывает /usr/bin/env для поиска Python, но он завершится ошибкой, если нет /usr/bin/env. Если вы знаете, где установлен Python, можно использовать этот путь. Команды whereis python и type -p python также могут помочь найти, где он установлен. Когда это известно, строку shebang можно соответствующим образом изменить: #!/usr/bin/python.
- Файл не должен содержать BOM (Byte Order Mark – маркер порядка байтов). BOM предназначен для определения порядка байтов в кодировках UTF-16, но некоторые редакторы записывают его и в UTF-8 файлы. BOM мешает строке shebang, поэтому обязательно укажите редактору не записывать BOM.
- mod_python может создавать проблемы. mod_python может обрабатывать CGI-скрипты сам, но он также может быть источником проблем. Убедитесь, что вы отключили его.
mod_python¶
Люди, приходящие из PHP, часто с трудом понимают, как использовать Python в вебе. Их первая мысль – mod_python, потому что они считают, что это аналог mod_php. На самом деле это не так. Он внедряет интерпретатор в процесс Apache, тем самым ускоряя запросы, так как не нужно запускать интерпретатор Python для каждого запроса. С другой стороны, это совсем не «Python, перемешанный с HTML», как это часто делается в PHP. Эквивалент этого в 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, SCGI и Apache: предыстория и будущее – это обсуждение того, почему концепция FastCGI и SCGI лучше, чем у mod_python.
Настройка FastCGI¶Setting 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. Преимущество этого подхода в том, что WSGI-приложения можно развёртывать гораздо проще, поскольку он специально спроектирован для размещения WSGI-приложений – в отличие от других низкоуровневых методов, которые используют связующий код для размещения WSGI-приложений (например, flup, упомянутый ранее). Недостаток в том, что mod_wsgi ограничен веб-сервером Apache; другим серверам потребуются собственные реализации mod_wsgi.
Он поддерживает два режима: встроенный режим, в котором он интегрируется с процессом Apache, и режим демона, который больше похож на FastCGI. В отличие от FastCGI, mod_wsgi самостоятельно управляет рабочими процессами, что упрощает администрирование.
Отступление: WSGI¶Step back: WSGI
WSGI уже упоминался несколько раз, значит, это что-то важное. И это действительно так, так что теперь пришло время объяснить.
Web Server Gateway Interface, PEP 333 или сокращённо WSGI, в настоящее время является наилучшим возможным способом веб-программирования на Python. Хотя он отлично подходит для программистов, пишущих фреймворки, обычному человеку не нужно вступать с ним в прямой контакт. Но при выборе фреймворка для веб-разработки стоит выбрать тот, который поддерживает WSGI.
Большая выгода от WSGI – унификация. Когда ваша программа совместима с WSGI (то есть ваш фреймворк поддерживает WSGI), её можно развернуть на любом веб-серверном интерфейсе, для которого существуют WSGI-обёртки. Так что вам не нужно беспокоиться, использует ли пользователь mod_python или FastCGI – с WSGI он просто работает на любом шлюзовом интерфейсе. Стандартная библиотека Python содержит свой собственный WSGI-сервер wsgiref – небольшой веб-сервер, который можно использовать для тестирования.
Действительно замечательная функция WSGI – это промежуточные слои (middlewares). Middleware – это слои вокруг вашей программы, которые могут добавлять ей различные функциональные возможности. Уже доступно много middleware. Например, вместо написания собственного управления сессиями (чтобы идентифицировать пользователя в последующих запросах, так как HTTP не поддерживает состояние и поэтому не знает, что запросы принадлежат одному пользователю) можно просто взять одну middleware, подключить её и положиться на уже существующую функциональность. То же самое со сжатием: допустим, вы хотите сжимать HTML с помощью gzip, чтобы сэкономить пропускную способность сервера. Тогда вам нужно лишь подключить middleware – и готово. Аутентификация также легко решается с помощью 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. Хотя теперь в него включена поддержка WSGI, старым версиям требовался отдельный код для работы на CGI, mod_python, FastCGI и в автономном режиме. Теперь всё это возможно с помощью WSGI и уже написанных шлюзов. Для работы с FastCGI можно использовать flup, а для запуска автономного сервера wsgiref – самый подходящий вариант.
Model-view-controller¶
Термин MVC часто можно услышать в утверждениях вроде «фреймворк foo поддерживает MVC». Хотя MVC – это не столько техническая вещь, сколько организационная, многие веб-фреймворки используют эту модель, чтобы помочь разработчику внести структуру в свою программу. Более крупные веб-приложения могут содержать много кода, поэтому иметь структуру в программе с самого начала – хорошая идея. Таким образом, даже пользователи других фреймворков (или даже языков, поскольку MVC не является чем-то специфичным для Python) смогут легче понять существующий код, поскольку они уже знакомы со структурой.
MVC расшифровывается как три компонента:
- Модель (model). Это данные, которые предназначены для изменения. В Python-фреймворках этот компонент часто представлен классами, используемыми объектно-реляционным отображением (ORM). Итак, все объявления находятся здесь.
- Представление (view). Задача этого компонента – отображать данные модели пользователю. Обычно этот компонент представлен шаблонами.
- Контроллер (controller). Это слой между пользователем и моделью. Контроллер реагирует на действия пользователя (например, открытие определённого URL) и сообщает модели о необходимости изменить данные.
Хотя можно подумать, что MVC – это сложный шаблон проектирования, на самом деле это не так. Он используется в Python, потому что оказался полезным для создания чистых и поддерживаемых веб-сайтов.
Примечание
Хотя не все Python-фреймворки явно поддерживают MVC, часто тривиально создать веб-сайт, использующий шаблон MVC, разделяя логику данных (модель), логику взаимодействия с пользователем (контроллер) и шаблоны (представление). Вот почему важно не писать лишний код Python в шаблонах – это противоречит MVC и создаёт больший хаос.
См. также
Английская Википедия содержит статью о шаблоне Model-View-Controller, которая включает длинный список веб-фреймворков для разных языков программирования.
Составляющие веб-сайтов¶Ingredients for web sites
Веб-сайты – это сложные конструкции, поэтому были созданы инструменты, помогающие разработчику веб-сайтов сделать его работу поддерживаемой. Ни один из этих инструментов не является специфичным для Python, они также существуют и для других языков программирования. Конечно, разработчики не обязаны использовать эти инструменты, и зачастую не существует «лучшего» инструмента, но стоит изучить информацию, прежде чем что-то выбирать, из-за большого количества помощников, которые разработчик может использовать.
См. также
Люди написали гораздо больше компонентов, которые можно комбинировать, чем представлено здесь. В вики Python есть страница об этих компонентах, называемая Web Components.
Шаблоны¶Templates
Смешивание HTML и Python-кода возможно с помощью некоторых библиотек. Хотя на первый взгляд это удобно, со временем код становится ужасно сложным в поддержке. Именно поэтому существуют шаблоны. В простейшем случае шаблоны – это просто HTML-файлы с заполнителями. HTML отправляется в браузер пользователя после заполнения заполнителей.
Python уже включает такие простые шаблоны:
# простой шаблон
template = "<html><body><h1>Hello {who}!</h1></body></html>"
print(template.format(who="Reader"))
Стандартная библиотека Python также включает более продвинутые шаблоны, доступные через string.Template, но в HTML-шаблонах необходимо использовать условные конструкции и циклы, такие как for и if. Поэтому требуется какой-либо шаблонизатор.
Сейчас в Python существует множество шаблонизаторов, которые можно использовать как с фреймворком, так и без него. Некоторые из них используют простой текстовый язык программирования, который очень легко выучить из-за его ограниченности, в то время как другие используют XML, поэтому вывод шаблона всегда гарантированно является валидным XML. Некоторые фреймворки поставляются со своим собственным шаблонизатором или рекомендуют определённый. Если ещё нет уверенности, использование таких шаблонизаторов – хорошая идея.
Примечание
Хотя в Python существует множество различных шаблонизаторов, обычно нет смысла использовать самодельную систему шаблонов. Время, затраченное на оценку всех шаблонных систем, того не стоит; лучше потратить его на изучение самых популярных. Некоторые фреймворки имеют собственный шаблонизатор или рекомендуют один из них. Разумно использовать их.
Популярные шаблонизаторы включают:
- Mako
- Genshi
- Jinja
См. также
Множество различных шаблонизаторов делят внимание между собой, потому что их легко создавать на Python. Страница Templating в вики содержит большой и постоянно растущий список таких шаблонизаторов.
Сохранение данных¶Data persistence
Постоянное хранение данных, хотя звучит очень сложно, на самом деле сводится к сохранению данных. Этими данными могут быть текст записей блога, сообщения на форуме или текст вики-страницы. Как всегда, существуют разные способы хранения информации на веб-сервере.
Часто используются реляционные базы данных, такие как MySQL или PostgreSQL, благодаря их хорошей производительности при работе с очень большими базами данных, состоящими из миллионов записей. К ним выполняются запросы на языке SQL. Программисты Python в целом не любят SQL слишком сильно, они предпочитают работать с объектами. Сохранять Python-объекты в базу данных можно с помощью технологии, называемой ORM. ORM преобразует все объектно-ориентированные обращения в SQL-код за кулисами, пользователю не нужно думать об этом. Большинство фреймворков используют ORM, и это работает достаточно хорошо.
Вторая возможность – использовать файлы, сохраняемые на жёстком диске (иногда называемые плоскими файлами). Это очень просто, но не слишком быстро. Существует даже небольшая база данных под названием SQLite, которая входит в состав Python в модуле sqlite и использует всего один файл. Эту базу данных можно использовать для хранения объектов через ORM, и у неё нет других зависимостей. Для небольших сайтов SQLite вполне достаточно. Но это не единственный способ сохранения данных в файловой системе. Иногда достаточно обычных текстовых файлов.
Третья и наименее используемая возможность – так называемые объектно-ориентированные базы данных. Такие базы данных хранят сами объекты, а не отношения, которые OR-отображение создаёт между строками в базе данных. Это даёт преимущество: почти все объекты могут быть сохранены простым способом, в отличие от реляционных баз данных, где некоторые объекты очень сложно представить с помощью ORM.
Фреймворки часто дают пользователям подсказки о том, какой метод выбрать. Обычно разумно придерживаться их, если только нет особых требований, которые заставляют использовать один метод, а не другой.
См. также
- Инструменты сохранения данных перечисляют возможности сохранения данных в файловой системе; некоторые из этих модулей входят в стандартную библиотеку
- Программирование баз данных помогает выбрать метод сохранения данных
- SQLAlchemy – самый мощный ORM для Python и Elixir, который упрощает его использование
- SQLObject, ещё один популярный ORM.
- ZODB и Durus, две объектно-ориентированные базы данных.
Фреймворки¶Frameworks
Поскольку веб-сайты могут легко стать довольно большими, существуют так называемые фреймворки, созданные для помощи разработчику в создании таких сайтов. Хотя самым известным фреймворком является Ruby on Rails, у Python тоже есть свои фреймворки, частично вдохновлённые Rails или существовавшие задолго до Rails.
Существуют два подхода к веб-фреймворкам: минималистичный и всё-включающий (иногда называемый full-stack). Фреймворки, которые включают всё, дают всё необходимое для начала работы: шаблонизатор, способ сохранения и доступа к данным в базах данных и многие другие возможности. Большинству пользователей лучше всего использовать их, поскольку они широко используются множеством других пользователей и хорошо документированы в книгах и учебниках. Другие веб-фреймворки следуют минималистичному подходу, стараясь быть максимально гибкими, оставляя пользователю свободу выбора того, что лучше подходит.
Большинству пользователей лучше всего подходят всё-включающие фреймворки. Они предоставляют всё необходимое, так что пользователь может просто приступить к работе и начать писать код. Хотя они имеют некоторые ограничения, они могут идеально выполнить 80% того, что когда-либо потребуется. Они состоят из различных компонентов, которые спроектированы для максимально хорошей совместной работы.
Множество веб-фреймворков, написанных на Python, показывает, что создать такой фреймворк действительно легко. Одно из самых известных веб-приложений, написанных на Python – Zope, который можно рассматривать как своего рода большой фреймворк. Но Zope был не единственным фреймворком; были и другие, которые сейчас почти забыты. Их уже не нужно упоминать, потому что большинство людей, которые их использовали, перешли на более новые.
Некоторые известные фреймворки¶Some notable frameworks
Существует невероятное количество фреймворков, поэтому нет возможности описать их все. Это даже не нужно, так как большинство этих фреймворков ничем особенным не выделяются, и всё, что можно сделать с их помощью, можно сделать и с помощью одного из популярных.
Django¶
Django – это фреймворк, состоящий из нескольких тесно связанных элементов, которые были написаны с нуля и отлично работают вместе. Он включает ORM, который довольно мощный и при этом прост в использовании, и имеет отличный онлайн-интерфейс администрирования, позволяющий редактировать данные в базе данных через браузер. Шаблонизатор основан на тексте и спроектирован так, чтобы его могли использовать дизайнеры страниц, не умеющие писать на Python. Он поддерживает так называемое наследование шаблонов и фильтры (которые работают как конвейеры Unix). Django включает множество удобных функций, такие как создание RSS-лент или обобщённые представления, которые позволяют создавать веб-сайты почти без написания Python-кода.
У него большое международное сообщество, которое создало множество сайтов с использованием Django. Существует также множество дополнительных проектов, расширяющих стандартную функциональность Django. Это отчасти связано с хорошо написанной онлайн-документацией Django и книгой по Django.
Примечание
Хотя Django является фреймворком в стиле MVC, он называет компоненты по-другому, что описано в FAQ по Django.
TurboGears¶
Другой популярный веб-фреймворк на Python – TurboGears. Он использует подход, при котором уже существующие компоненты комбинируются с помощью связующего кода для создания целостного опыта. TurboGears предоставляет пользователю больше гибкости в выборе компонентов: ORM можно переключать между простыми в использовании, но ограниченными, и сложными, но очень мощными. То же самое касается шаблонизатора. Одна из сильных сторон TurboGears в том, что компоненты, из которых он состоит, могут легко использоваться в других проектах без зависимости от TurboGears, например, базовый веб-сервер CherryPy.
Документацию можно найти в вики TurboGears, где также есть ссылки на скринкасты. У TurboGears также активное сообщество пользователей, которое может ответить на большинство связанных вопросов. Также опубликована книга по TurboGears, которая является хорошей отправной точкой.
Планом для следующей крупной версии TurboGears, версии 2.0, является переход на более гибкую основу, предоставляемую другим очень гибким веб-фреймворком под названием Pylons.
Другие известные фреймворки¶Other notable frameworks
Эти два, конечно, не единственные доступные фреймворки; есть также некоторые менее популярные, которые стоит упомянуть.
Один из них – уже упомянутый Zope, который существует довольно давно. Поскольку Zope 2.x был известен как довольно не-питоничный, более новый Zope 3.x пытается это изменить и поэтому получает больше признания от программистов Python. Эти усилия уже принесли результаты: существует проект, соединяющий Zope с WSGI, под названием Repoze, и другой проект Grok, который позволяет «обычным» программистам Python использовать очень зрелые компоненты Zope.
Ещё один уже упомянутый фреймворк – Pylons. Pylons во многом похож на TurboGears, но с ещё большим акцентом на гибкость, что достигается ценой более сложного использования. Почти каждый компонент можно заменить, что вынуждает обращаться к документации каждого отдельного компонента, поскольку существует так много возможных комбинаций Pylons, способных удовлетворить любые требования. Pylons построен на Paste, обширном наборе инструментов, полезных для WSGI.
И это ещё не всё. Самую актуальную информацию всегда можно найти в вики Python.
См. также
В вики Python есть обширный список веб-фреймворков.
Большинство фреймворков также имеют собственные списки рассылки и IRC-каналы; сведения о них можно найти на сайтах проектов. Также существует общий IRC-канал «Python in the Web» на freenode под названием #python.web.