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

webservers.md

321 строк · 57.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/howto/webservers.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# HOWTO Использование Python в вебе89**Автор**1011Marek Kubica1213Аннотация1415В этом документе показано, как Python вписывается в веб. В нём представлены некоторые способы интеграции Python с веб-сервером и общие практики, полезные для разработки веб-сайтов.1617Программирование для веба стало горячей темой с появлением «Веб 2.0», которая сосредоточена на пользовательском контенте на веб-сайтах. Всегда было возможно использовать Python для создания веб-сайтов, но это была довольно утомительная задача. Поэтому было создано множество фреймворков и вспомогательных инструментов, чтобы помочь разработчикам создавать более быстрые и надёжные сайты. В данном HOWTO описываются некоторые методы комбинирования Python с веб-сервером для создания динамического контента. Он не предназначен для полного введения, так как эта тема слишком широка, чтобы быть охваченной в одном документе. Однако предоставлен краткий обзор наиболее популярных библиотек.1819> **См. также**20>21> Хотя данный HOWTO пытается дать обзор использования Python в вебе, он не может всегда быть настолько актуальным, как хотелось бы. Разработка веб-приложений на Python быстро развивается, поэтому страница вики по теме [Web Programming](https://python-all.ru/2.7/howto/webservers.html) может быть более синхронизирована с последними разработками.2223## Низкоуровневый обзор2425Когда пользователь заходит на веб-сайт, его браузер устанавливает соединение с веб-сервером сайта (это называется *запросом*). Сервер ищет файл в файловой системе и отправляет его обратно в браузер пользователя, который его отображает (это *ответ*). Примерно так работает лежащий в основе протокол HTTP.2627Динамические веб-сайты основаны не на файлах в файловой системе, а на программах, которые запускаются веб-сервером при поступлении запроса и которые *генерируют* контент, возвращаемый пользователю. Они могут выполнять всевозможные полезные действия, например, отображать сообщения на доске объявлений, показывать вашу электронную почту, настраивать программное обеспечение или просто показывать текущее время. Эти программы могут быть написаны на любом языке программирования, который поддерживает сервер. Поскольку большинство серверов поддерживают Python, легко использовать Python для создания динамических веб-сайтов.2829Большинство HTTP-серверов написаны на C или C++, поэтому они не могут напрямую выполнять код Python – необходим мост между сервером и программой. Эти мосты, вернее интерфейсы, определяют, как программы взаимодействуют с сервером. Было множество попыток создать наилучший возможный интерфейс, но лишь немногие заслуживают упоминания.3031Не каждый веб-сервер поддерживает все интерфейсы. Многие веб-серверы поддерживают только старые, ныне устаревшие интерфейсы; однако их часто можно расширить с помощью сторонних модулей для поддержки более новых.3233### Общий шлюзовой интерфейс3435Этот интерфейс, чаще всего называемый «CGI», является старейшим и поддерживается почти каждым веб-сервером «из коробки». Программы, использующие CGI для взаимодействия со своим веб-сервером, должны запускаться сервером для каждого запроса. Таким образом, каждый запрос запускает новый интерпретатор Python – что требует некоторого времени на запуск – поэтому весь интерфейс пригоден только для ситуаций с низкой нагрузкой.3637Преимущество CGI в его простоте – написание программы на Python, использующей CGI, сводится примерно к трём строкам кода. Эта простота имеет свою цену: он предоставляет очень мало возможностей в помощь разработчику.3839Написание CGI-программ хотя и возможно, но больше не рекомендуется. С [WSGI](https://python-all.ru/2.7/howto/webservers.html#wsgi), тема которого рассматривается далее в этом документе, можно писать программы, эмулирующие CGI, чтобы их можно было запускать как CGI, если нет лучшего варианта.4041> **См. также**42>43> Стандартная библиотека Python включает несколько модулей, полезных для создания простых CGI-программ:44>45> - [`cgi`](https://python-all.ru/2.7/library/cgi.html#module-cgi) – Обработка пользовательского ввода в CGI-скриптах46> - [`cgitb`](https://python-all.ru/2.7/library/cgitb.html#module-cgitb) – Отображает понятные трассировки при ошибках в CGI-приложениях, вместо сообщения «500 Internal Server Error»47>48> Вики-сайт Python содержит страницу о [CGI-скриптах](https://python-all.ru/2.7/howto/webservers.html) с дополнительной информацией о CGI в Python.4950#### Простой скрипт для тестирования CGI5152Чтобы проверить, работает ли ваш веб-сервер с CGI, можно использовать эту короткую и простую CGI-программу:5354```python55#!/usr/bin/env python56# -*- coding: UTF-8 -*-5758# включить отладку59import cgitb60cgitb.enable()6162print "Content-Type: text/plain;charset=utf-8"63print6465print "Hello World!"66```6768В зависимости от конфигурации веб-сервера может потребоваться сохранить этот код с `.py` или `.cgi` расширением. Кроме того, из соображений безопасности этот файл может также находиться в папке `cgi-bin`.6970Возможно, вы задаетесь вопросом, для чего нужна строка `cgitb`. Эта строка позволяет отображать понятную трассировку вместо того, чтобы просто завершаться ошибкой и показывать «Internal Server Error» в браузере пользователя. Это полезно для отладки, но может быть риск раскрытия конфиденциальных данных пользователю. По этой причине не следует использовать `cgitb` в рабочем коде. Следует *всегда* перехватывать исключения и отображать подходящие страницы ошибок – конечные пользователи не любят видеть непонятные «Internal Server Errors» в своих браузерах.7172#### Настройка CGI на собственном сервере7374Если у вас нет собственного веб-сервера, это к вам не относится. Можно проверить, работает ли он «как есть», и если нет, вам нужно будет поговорить с администратором вашего веб-сервера. Если это крупный хостинг, можно попробовать создать тикет с запросом поддержки Python.7576Если вы сами являетесь администратором или хотите настроить CGI для тестирования на своих собственных компьютерах, вам придётся настроить его самостоятельно. Не существует единого способа настройки CGI, поскольку есть много веб-серверов с разными параметрами конфигурации. В настоящее время наиболее широко используемым бесплатным веб-сервером является [Apache HTTPd](https://python-all.ru/2.7/howto/webservers.html), или кратко Apache. Apache можно легко установить практически на любую систему с помощью системного менеджера пакетов. [lighttpd](https://python-all.ru/2.7/howto/webservers.html) является ещё одной альтернативой и, как говорят, обладает лучшей производительностью. На многих системах этот сервер также можно установить с помощью менеджера пакетов, так что ручная компиляция веб-сервера может не потребоваться.7778- В Apache можно обратиться к руководству [Dynamic Content with CGI](https://python-all.ru/2.7/howto/webservers.html), где все описано. В большинстве случаев достаточно просто установить `+ExecCGI`. В руководстве также описаны наиболее распространенные ловушки, которые могут возникнуть.79- В lighttpd нужно использовать [CGI module](https://python-all.ru/2.7/howto/webservers.html), который настраивается простым способом. В конечном итоге все сводится к правильной установке `cgi.assign`.8081#### Распространённые проблемы с CGI-скриптами8283Использование CGI иногда приводит к небольшим неприятностям при попытке запустить эти скрипты. Иногда, казалось бы, правильный скрипт работает не так, как ожидается, причиной чему является какая-то маленькая скрытая проблема, которую трудно заметить.8485Некоторые из этих потенциальных проблем:8687- Скрипт Python не помечен как исполняемый. Если CGI-скрипты не являются исполняемыми, большинство веб-серверов позволят пользователю скачать их, вместо того чтобы выполнять и отправлять вывод пользователю. Чтобы CGI-скрипты правильно работали в Unix-подобных операционных системах, должен быть установлен бит `+x`. Использование `chmod a+x your_script.py` может решить эту проблему.88- В Unix-подобных системах окончания строк в файле программы должны быть в стиле Unix. Это важно, потому что веб-сервер проверяет первую строку скрипта (так называемый шебанг) и пытается запустить указанную там программу. Он легко путается с окончаниями строк Windows (возврат каретки и перевод строки, также называемые CRLF), поэтому необходимо преобразовать файл в окончания строк Unix (только перевод строки, LF). Это можно сделать автоматически, загружая файл через FTP в текстовом режиме, а не в двоичном, но предпочтительный способ – указать редактору сохранять файлы с окончаниями строк Unix. Большинство редакторов это поддерживают.89- Веб-сервер должен иметь возможность читать файл, и необходимо убедиться, что права доступа правильные. В Unix-подобных системах сервер часто работает от имени пользователя и группы `www-data`, поэтому стоит попробовать изменить владельца файла или сделать файл общедоступным для чтения с помощью `chmod a+r your_script.py`.90- Веб-сервер должен знать, что файл, к которому вы пытаетесь получить доступ, является CGI-скриптом. Проверьте конфигурацию вашего веб-сервера: возможно, он настроен на ожидание определённого расширения файла для CGI-скриптов.91- В Unix-подобных системах путь к интерпретатору в shebang (`#!/usr/bin/env python`) должен быть правильным. Эта строка вызывает `/usr/bin/env` для поиска Python, но завершится ошибкой, если нет `/usr/bin/env`, или если Python не находится в пути веб-сервера. Если известно, где установлен Python, можно использовать полный путь. Команды `whereis python` и `type -p python` могут помочь найти, где он установлен. Как только путь известен, можно изменить shebang соответствующим образом: `#!/usr/bin/python`.92- Файл не должен содержать BOM (метку порядка байтов). BOM предназначен для определения порядка байтов в кодировках UTF-16 и UTF-32, но некоторые редакторы записывают его также в UTF-8 файлы. BOM мешает работе строки шебанга, поэтому убедитесь, что ваш редактор не записывает BOM.93- Если веб-сервер использует [mod\_python](https://python-all.ru/2.7/howto/webservers.html#mod-python), `mod_python` может иметь проблемы. `mod_python` способен обрабатывать CGI-скрипты самостоятельно, но он также может быть источником проблем.9495### mod\_python9697Люди, пришедшие из PHP, часто с трудом понимают, как использовать Python в вебе. Их первая мысль обычно – [mod\_python](https://python-all.ru/2.7/howto/webservers.html), потому что они считают, что это аналог `mod_php`. На самом деле между ними много различий. Что делает `mod_python`, так это встраивает интерпретатор в процесс Apache, ускоряя запросы за счет того, что не нужно запускать интерпретатор Python для каждого запроса. С другой стороны, это не «Python, смешанный с HTML» в том смысле, в котором PHP часто смешивают с HTML. Эквивалент в Python – это шаблонизатор. `mod_python` сам по себе гораздо мощнее и предоставляет больше доступа к внутренним механизмам Apache. Он может эмулировать CGI, работать в режиме «Python Server Pages» (похожем на JSP), который представляет собой «HTML, переплетенный с Python», и имеет «Publisher», который назначает один файл для приема всех запросов и решения, что с ними делать.9899У `mod_python` есть некоторые проблемы. В отличие от интерпретатора PHP, интерпретатор Python использует кэширование при выполнении файлов, поэтому изменения в файле потребуют перезапуска веб-сервера. Другая проблема – это основная концепция: Apache запускает дочерние процессы для обработки запросов, и, к сожалению, каждый дочерний процесс должен загружать весь интерпретатор Python, даже если он его не использует. Это замедляет весь веб-сервер. Еще одна проблема заключается в том, что `mod_python` привязан к конкретной версии `libpython`, поэтому невозможно переключиться со старой версии на новую (например, с 2.4 на 2.5) без перекомпиляции `mod_python`. `mod_python` также привязан к веб-серверу Apache, поэтому программы, написанные для `mod_python`, не могут легко работать на других веб-серверах.100101Вот причины, по которым следует избегать `mod_python` при написании новых программ. В некоторых обстоятельствах все же может быть хорошей идеей использовать `mod_python` для развертывания, но WSGI позволяет запускать программы WSGI также под `mod_python`.102103### FastCGI и SCGI104105FastCGI и SCGI пытаются решить проблему производительности CGI иным способом. Вместо встраивания интерпретатора в веб-сервер они создают долгоживущие фоновые процессы. В веб-сервере по-прежнему есть модуль, который позволяет веб-серверу «общаться» с фоновым процессом. Поскольку фоновый процесс не зависит от сервера, он может быть написан на любом языке, включая Python. Языку просто нужна библиотека, обрабатывающая взаимодействие с веб-сервером.106107Разница между FastCGI и SCGI очень мала, поскольку SCGI – это, по сути, просто «упрощённый FastCGI». Из-за ограниченной поддержки SCGI веб-серверами большинство людей вместо него используют FastCGI, который работает так же. Почти всё, что применимо к SCGI, применимо и к FastCGI, поэтому мы рассмотрим только последний.108109В наши дни FastCGI никогда не используется напрямую. Так же, как и `mod_python`, он используется только для развертывания WSGI-приложений.110111#### Настройка FastCGI112113Каждому веб-серверу требуется свой модуль.114115- Apache имеет как [mod\_fastcgi](https://python-all.ru/2.7/howto/webservers.html), так и [mod\_fcgid](https://python-all.ru/2.7/howto/webservers.html). `mod_fastcgi` является оригинальным, но у него есть некоторые лицензионные проблемы, из-за которых он иногда считается несвободным. `mod_fcgid` – это меньшая совместимая альтернатива. Один из этих модулей должен быть загружен Apache.116- lighttpd поставляется со своим [модулем FastCGI](https://python-all.ru/2.7/howto/webservers.html), а также с [модулем SCGI](https://python-all.ru/2.7/howto/webservers.html).117- [nginx](https://python-all.ru/2.7/howto/webservers.html) также поддерживает [FastCGI](https://python-all.ru/2.7/howto/webservers.html).118119После установки и настройки модуля вы можете проверить его с помощью следующего WSGI-приложения:120121```python122#!/usr/bin/env python123# -*- coding: UTF-8 -*-124125from cgi import escape126import sys, os127from flup.server.fcgi import WSGIServer128129def app(environ, start_response):130    start_response('200 OK', [('Content-Type', 'text/html')])131132    yield '<h1>FastCGI Environment</h1>'133    yield '<table>'134    for k, v in sorted(environ.items()):135        yield '<tr><th>%s</th><td>%s</td></tr>' % (escape(k), escape(v))136    yield '</table>'137138WSGIServer(app).run()139```140141Это простое WSGI-приложение, но сначала нужно установить [flup](https://python-all.ru/2.7/howto/webservers.html), так как flup обрабатывает низкоуровневый доступ к FastCGI.142143> **См. также**144>145> Существует документация по [настройке Django с WSGI](https://python-all.ru/2.7/howto/webservers.html), большая часть которой может быть использована повторно для других фреймворков и библиотек, совместимых с WSGI. Нужно изменить только часть `manage.py`; вместо нее можно использовать пример, приведенный здесь. Django делает примерно то же самое.146147### mod\_wsgi148149[mod\_wsgi](https://python-all.ru/2.7/howto/webservers.html) – это попытка избавиться от низкоуровневых шлюзов. Учитывая, что FastCGI, SCGI и mod\_python в основном используются для развёртывания WSGI-приложений, mod\_wsgi был создан для прямого встраивания WSGI-приложений в веб-сервер Apache. mod\_wsgi специально разработан для размещения WSGI-приложений. Он делает развёртывание WSGI-приложений намного проще, чем развёртывание с использованием других низкоуровневых методов, требующих связующего кода. Недостаток в том, что mod\_wsgi ограничен веб-сервером Apache; другим серверам потребуются собственные реализации mod\_wsgi.150151mod\_wsgi поддерживает два режима: встроенный режим, при котором он интегрируется с процессом Apache, и режим демона, который больше похож на FastCGI. В отличие от FastCGI, mod\_wsgi самостоятельно управляет рабочими процессами, что упрощает администрирование.152153## Отступление: WSGI154155WSGI уже упоминалось несколько раз, так что это, должно быть, что-то важное. На самом деле так и есть, и теперь настало время объяснить, что это такое.156157*Web Server Gateway Interface* (сокращённо WSGI) определён в [**PEP 333**](https://python-all.ru/2.7/howto/webservers.html) и в настоящее время является лучшим способом веб-программирования на Python. Хотя он отлично подходит для программистов, пишущих фреймворки, обычному веб-разработчику не нужно напрямую с ним сталкиваться. При выборе фреймворка для веб-разработки стоит выбрать тот, который поддерживает WSGI.158159Большое преимущество WSGI – унификация интерфейса прикладного программирования. Когда ваша программа совместима с WSGI – что на внешнем уровне означает, что используемый фреймворк поддерживает WSGI – ее можно развернуть через любой интерфейс веб-сервера, для которого существуют WSGI-обертки. Вам не нужно беспокоиться о том, использует ли пользователь приложения mod\_python, FastCGI или mod\_wsgi – с WSGI ваше приложение будет работать на любом шлюзовом интерфейсе. Стандартная библиотека Python содержит собственный WSGI-сервер, [`wsgiref`](https://python-all.ru/2.7/library/wsgiref.html#module-wsgiref), который является небольшим веб-сервером, пригодным для тестирования.160161Действительно отличная возможность WSGI – это промежуточное ПО (middleware). Middleware – это слой вокруг вашей программы, который может добавлять различные функции. Уже доступно немало [middleware](https://python-all.ru/2.7/howto/webservers.html). Например, вместо написания собственного управления сессиями (HTTP – протокол без состояния, поэтому для связывания нескольких HTTP-запросов с одним пользователем ваше приложение должно создавать и управлять таким состоянием через сессию) можно просто скачать middleware, которое это делает, подключить его и продолжить кодирование уникальных частей приложения. То же самое со сжатием: существует готовое middleware, которое сжимает ваш HTML с помощью gzip для экономии пропускной способности сервера. Аутентификация – еще одна проблема, которая легко решается с помощью существующего middleware.162163Хотя WSGI может показаться сложным, начальный этап обучения может быть очень полезным, поскольку WSGI и связанное с ним промежуточное ПО уже содержат решения многих проблем, которые могут возникнуть при разработке веб-сайтов.164165### WSGI-серверы166167Код, используемый для подключения к различным низкоуровневым шлюзам, таким как CGI или mod\_python, называется *WSGI-сервером*. Один из таких серверов – `flup`, который поддерживает FastCGI и SCGI, а также [AJP](https://python-all.ru/2.7/howto/webservers.html). Некоторые из этих серверов написаны на Python, как `flup`, но существуют и другие, написанные на C и используемые в качестве готовой замены.168169Уже существует множество серверов, поэтому веб-приложение на Python можно развернуть практически где угодно. Это одно из главных преимуществ Python перед другими веб-технологиями.170171> **См. также**172>173> Хороший обзор кода, связанного с WSGI, можно найти на [домашней странице WSGI](https://python-all.ru/2.7/howto/webservers.html), где представлен обширный список [WSGI-серверов](https://python-all.ru/2.7/howto/webservers.html), которые может использовать *любое* приложение, поддерживающее WSGI.174>175> Возможно, вам будут интересны некоторые модули, поддерживающие WSGI, уже входящие в стандартную библиотеку, а именно:176>177> - [`wsgiref`](https://python-all.ru/2.7/library/wsgiref.html#module-wsgiref) – несколько крошечных утилит и серверов для WSGI178179### Пример: MoinMoin180181Что даёт WSGI разработчику веб-приложений? Давайте взглянем на приложение, которое существует уже некоторое время и было написано на Python без использования WSGI.182183Один из самых популярных пакетов вики-программного обеспечения – [MoinMoin](https://python-all.ru/2.7/howto/webservers.html). Он был создан в 2000 году, то есть примерно на три года раньше WSGI. В старых версиях требовался отдельный код для работы с CGI, mod\_python, FastCGI и в автономном режиме.184185Теперь он включает поддержку WSGI. Благодаря WSGI MoinMoin можно развернуть на любом сервере, совместимом с WSGI, без дополнительного склеивающего кода. В отличие от версий до WSGI, это могут быть WSGI-серверы, о которых авторы MoinMoin даже не знают.186187## Модель-Представление-Контроллер188189Термин *MVC* часто встречается в утверждениях вроде «фреймворк *foo* поддерживает MVC». MVC – это скорее общая организация кода, а не конкретный API. Многие веб-фреймворки используют эту модель, чтобы помочь разработчику структурировать программу. Крупные веб-приложения могут содержать много кода, поэтому хорошей идеей будет заложить эффективную структуру с самого начала. Так даже пользователи других фреймворков (или даже других языков, поскольку MVC не специфичен для Python) смогут легко понять код, если они уже знакомы со структурой MVC.190191MVC расшифровывается как три компонента:192193- *Модель (model)*. Это данные, которые будут отображаться и изменяться. В фреймворках Python этот компонент часто представлен классами, используемыми объектно-реляционным маппером (ORM).194- *Представление (view)*. Задача этого компонента – отображать данные модели пользователю. Обычно этот компонент реализуется с помощью шаблонов.195- *Контроллер (controller)*. Это прослойка между пользователем и моделью. Контроллер реагирует на действия пользователя (например, открытие определённого URL), сообщает модели при необходимости изменить данные и указывает коду представления, что отображать.196197Хотя можно подумать, что MVC – это сложный шаблон проектирования, на самом деле это не так. Он используется в Python, потому что оказался полезным для создания чистых и поддерживаемых веб-сайтов.198199> **Примечание**200>201> Хотя не все фреймворки Python явно поддерживают MVC, часто тривиально создать веб-сайт, использующий шаблон MVC, разделяя логику данных (модель), логику взаимодействия с пользователем (контроллер) и шаблоны (представление). Вот почему важно не писать лишний код Python в шаблонах – это противоречит модели MVC и создаёт хаос в кодовой базе, усложняя её понимание и модификацию.202203> **См. также**204>205> В английской Википедии есть статья о [шаблоне Model-View-Controller](https://python-all.ru/2.7/howto/webservers.html). В ней представлен длинный список веб-фреймворков для различных языков программирования.206207## Ингредиенты для веб-сайтов208209Веб-сайты – это сложные конструкции, поэтому были созданы инструменты, помогающие веб-разработчикам писать код проще и делать его более поддерживаемым. Такие инструменты существуют для всех веб-фреймворков на всех языках. Разработчики не обязаны использовать эти инструменты, и часто не существует «лучшего» инструмента. Стоит изучить доступные инструменты, потому что они могут значительно упростить процесс разработки веб-сайта.210211> **См. также**212>213> Компонентов гораздо больше, чем можно представить здесь. В вики-разделе Python есть страница об этих компонентах под названием [Web Components](https://python-all.ru/2.7/howto/webservers.html).214215### Шаблоны216217Смешивание HTML- и Python-кода стало возможным благодаря нескольким библиотекам. Поначалу это удобно, но приводит к ужасно неподдерживаемому коду. Именно поэтому существуют шаблоны. Шаблоны в простейшем случае – это просто HTML-файлы с заполнителями. HTML отправляется в браузер пользователя после заполнения этих заполнителей.218219Python уже включает два способа создания простых шаблонов:220221```python222>>> template = "<html><body><h1>Hello %s!</h1></body></html>"223>>> print template % "Reader"224<html><body><h1>Hello Reader!</h1></body></html>225226>>> from string import Template227>>> template = Template("<html><body><h1>Hello ${name}</h1></body></html>")228>>> print template.substitute(dict(name='Dinsdale'))229<html><body><h1>Hello Dinsdale!</h1></body></html>230```231232Для генерации сложного HTML на основе нетривиальных данных модели обычно требуются условные конструкции и циклы, такие как *for* и *if* в Python. *Шаблонизаторы (template engines)* поддерживают шаблоны такой сложности.233234Для Python доступно множество шаблонизаторов, которые можно использовать как с [фреймворком](https://python-all.ru/2.7/howto/webservers.html#framework), так и без него. Некоторые из них определяют текстовый язык программирования, который легко выучить, отчасти из-за ограниченной области применения. Другие используют XML, и вывод шаблона гарантированно всегда будет корректным XML. Существует множество других вариаций.235236Некоторые [фреймворки](https://python-all.ru/2.7/howto/webservers.html#frameworks) поставляются со своим шаблонизатором или рекомендуют какой-то конкретный. Если нет причин использовать другой шаблонизатор, хорошей идеей будет использовать тот, который предоставляется или рекомендуется фреймворком.237238Популярные шаблонизаторы включают:239240> - [Mako](https://python-all.ru/2.7/howto/webservers.html)241> - [Genshi](https://python-all.ru/2.7/howto/webservers.html)242> - [Jinja](https://python-all.ru/2.7/howto/webservers.html)243244> **См. также**245>246> Существует множество шаблонизаторов, борющихся за внимание, потому что создать их на Python довольно легко. Страница [Templating](https://python-all.ru/2.7/howto/webservers.html) в вики содержит большой и постоянно растущий их список. Три перечисленных выше считаются шаблонизаторами «второго поколения» и являются хорошей отправной точкой.247248### Сохранение данных249250*Сохранение данных*, хоть и звучит очень сложно, на самом деле сводится к хранению данных. Эти данные могут быть текстом записей блога, сообщениями на форуме или текстом вики-страницы. Конечно, существует множество различных способов хранения информации на веб-сервере.251252Часто используются реляционные базы данных, такие как [MySQL](https://python-all.ru/2.7/howto/webservers.html) или [PostgreSQL](https://python-all.ru/2.7/howto/webservers.html), благодаря их хорошей производительности при работе с очень большими базами данных, содержащими миллионы записей. Существует также небольшая база данных [SQLite](https://python-all.ru/2.7/howto/webservers.html), которая входит в состав Python в модуле [`sqlite3`](https://python-all.ru/2.7/library/sqlite3.html#module-sqlite3) и использует только один файл. У нее нет других зависимостей. Для небольших сайтов SQLite вполне достаточно.253254Relational databases are *queried* using a language called [SQL](https://python-all.ru/2.7/howto/webservers.html). 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](https://python-all.ru/2.7/howto/webservers.html) (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](https://python-all.ru/2.7/howto/webservers.html#frameworks) use ORMs, and it works quite well.255256Второй вариант – хранение данных в обычных текстовых файлах (иногда называемых «плоскими файлами»). Для простых сайтов это очень просто, но может оказаться сложным, если веб-сайт выполняет множество обновлений хранящихся данных.257258Третий вариант – объектно-ориентированные базы данных (также называемые «объектными базами данных»). Они хранят данные объектов в форме, близкой к тому, как объекты структурированы в памяти во время выполнения программы. (В отличие от ORM, которые хранят данные объектов как строки в таблицах и связи между этими строками.) Прямое сохранение объектов имеет преимущество: почти все объекты могут быть сохранены простым способом, в отличие от реляционных баз данных, где некоторые объекты очень сложно представить.259260[Фреймворки](https://python-all.ru/2.7/howto/webservers.html#frameworks) часто дают подсказки о том, какой метод хранения данных выбрать. Обычно лучше придерживаться хранилища данных, рекомендованного фреймворком, если только приложение не имеет особых требований, которые лучше удовлетворяются альтернативным механизмом хранения.261262> **См. также**263>264> - [Инструменты для сохранения данных](https://python-all.ru/2.7/howto/webservers.html) перечисляют возможности сохранения данных в файловой системе. Некоторые из этих модулей являются частью стандартной библиотеки.265> - [Программирование баз данных](https://python-all.ru/2.7/howto/webservers.html) помогает выбрать метод сохранения данных.266> - [SQLAlchemy](https://python-all.ru/2.7/howto/webservers.html), самый мощный ORM для Python, и [Elixir](https://python-all.ru/2.7/howto/webservers.html), который упрощает использование SQLAlchemy.267> - [SQLObject](https://python-all.ru/2.7/howto/webservers.html), ещё один популярный ORM.268> - [ZODB](https://python-all.ru/2.7/howto/webservers.html) и [Durus](https://python-all.ru/2.7/howto/webservers.html), две объектно-ориентированные базы данных.269270## Фреймворки271272Процесс создания кода для работы веб-сайтов включает написание кода, предоставляющего различные сервисы. Код для конкретного сервиса часто работает одинаково независимо от сложности или назначения веб-сайта. Абстрагирование этих общих решений в многократно используемый код приводит к тому, что называется «фреймворками» для веб-разработки. Пожалуй, самый известный фреймворк для веб-разработки – Ruby on Rails, но у Python есть свои фреймворки. Некоторые из них частично вдохновлены Rails или позаимствовали идеи у Rails, но многие существовали задолго до Rails.273274Изначально веб-фреймворки Python стремились включать все сервисы, необходимые для разработки веб-сайтов, в виде единого гигантского набора инструментов. Никакие два веб-фреймворка не были совместимы: программу, разработанную для одного, нельзя было развернуть на другом без значительных переработок. Это привело к созданию «минималистичных» веб-фреймворков, которые предоставляли только инструменты для взаимодействия между кодом Python и протоколом HTTP, а все остальные сервисы добавлялись сверху через отдельные компоненты. Были разработаны некоторые ad hoc стандарты, обеспечивающие ограниченную совместимость между фреймворками, например стандарт, позволяющий взаимозаменяемо использовать разные шаблонизаторы.275276С появлением WSGI мир веб-фреймворков Python развивается в направлении совместимости на основе стандарта WSGI. Теперь многие веб-фреймворки, будь то «полностековые» (предоставляющие все инструменты, необходимые для развертывания самых сложных веб-сайтов) или минималистичные, или что-то среднее, строятся из коллекций многократно используемых компонентов, которые можно использовать с более чем одним фреймворком.277278Большинство пользователей, вероятно, захотят выбрать «полностековый» фреймворк с активным сообществом. Такие фреймворки, как правило, хорошо документированы и предоставляют самый простой путь к созданию полностью функционального веб-сайта за минимальное время.279280### Некоторые известные фреймворки281282Существует невероятное количество фреймворков, поэтому здесь невозможно охватить их все. Вместо этого мы кратко рассмотрим некоторые из самых популярных.283284#### Django285286[Django](https://python-all.ru/2.7/howto/webservers.html) – это фреймворк, состоящий из нескольких тесно связанных элементов, которые были написаны с нуля и отлично работают вместе. Он включает ORM, который довольно мощный и при этом прост в использовании, а также отличный веб-интерфейс администратора, позволяющий редактировать данные в базе данных через браузер. Шаблонизатор основан на тексте и спроектирован так, чтобы его могли использовать дизайнеры страниц, не умеющие писать на Python. Он поддерживает наследование шаблонов и фильтры (работающие как каналы Unix). Django включает множество удобных функций, таких как создание RSS-лент или общие представления (generic views), что позволяет создавать веб-сайты почти без написания кода на Python.287288У него большое международное сообщество, участники которого создали множество веб-сайтов. Также существует много дополнительных проектов, расширяющих стандартную функциональность Django. Это частично объясняется хорошо написанной [онлайн-документацией](https://python-all.ru/2.7/howto/webservers.html) Django и [книгой по Django](https://python-all.ru/2.7/howto/webservers.html).289290> **Примечание**291>292> Хотя Django является фреймворком в стиле MVC, он называет элементы по-другому, что описано в [Django FAQ](https://python-all.ru/2.7/howto/webservers.html).293294#### TurboGears295296Ещё один популярный веб-фреймворк для Python – [TurboGears](https://python-all.ru/2.7/howto/webservers.html). TurboGears использует подход, заключающийся в применении уже существующих компонентов и их объединении с помощью склеивающего кода для создания бесшовного опыта. TurboGears предоставляет пользователю гибкость в выборе компонентов. Например, ORM и шаблонизатор можно заменить на пакеты, отличные от используемых по умолчанию.297298Документацию можно найти в [документации TurboGears](https://python-all.ru/2.7/howto/webservers.html), где также можно найти ссылки на скринкасты. Кроме того, у TurboGears есть активное сообщество пользователей, которое может ответить на большинство соответствующих вопросов. Также была опубликована [книга по TurboGears](https://python-all.ru/2.7/howto/webservers.html), которая является хорошей отправной точкой.299300Новейшая версия TurboGears, версия 2.0, делает ещё один шаг в направлении поддержки WSGI и компонентной архитектуры. TurboGears 2 основан на стеке WSGI другого популярного веб-фреймворка с компонентной архитектурой – [Pylons](https://python-all.ru/2.7/howto/webservers.html).301302#### Zope303304Фреймворк Zope – один из «старых оригинальных» фреймворков. Его текущее воплощение, Zope2, представляет собой тесно интегрированный полностековой фреймворк. Одна из его самых интересных особенностей – тесная интеграция с мощной объектной базой данных [ZODB](https://python-all.ru/2.7/howto/webservers.html) (Zope Object Database). Из-за своей высокой интегрированности Zope оказался в несколько изолированной экосистеме: код, написанный для Zope, был не очень пригоден для использования вне Zope, и наоборот. Для решения этой проблемы был начат проект Zope 3. Zope 3 перепроектирует Zope как набор более чистых изолированных компонентов. Этот проект был начат до появления стандарта WSGI, но поддержка WSGI для Zope 3 есть от проекта [Repoze](https://python-all.ru/2.7/howto/webservers.html). Компоненты Zope имеют за плечами много лет промышленного использования, и проект Zope 3 предоставляет доступ к этим компонентам более широкому сообществу Python. Существует даже отдельный фреймворк на основе компонентов Zope: [Grok](https://python-all.ru/2.7/howto/webservers.html).305306Zope также является инфраструктурой, используемой системой управления контентом [Plone](https://python-all.ru/2.7/howto/webservers.html), одной из самых мощных и популярных доступных систем управления контентом.307308#### Другие известные фреймворки309310Конечно, это не единственные доступные фреймворки. Есть много других фреймворков, заслуживающих упоминания.311312Еще один уже упомянутый фреймворк – [Pylons](https://python-all.ru/2.7/howto/webservers.html). Pylons во многом похож на TurboGears, но с ещё большим акцентом на гибкость, что достигается ценой более сложного использования. Почти любой компонент можно заменить, из-за чего приходится обращаться к документации каждого отдельного компонента, а их много. Pylons построен на [Paste](https://python-all.ru/2.7/howto/webservers.html) – обширном наборе инструментов, полезных для WSGI.313314И это ещё не всё. Самую актуальную информацию всегда можно найти в вики Python.315316> **См. также**317>318> В вики Python есть обширный список [веб-фреймворков](https://python-all.ru/2.7/howto/webservers.html).319>320> У большинства фреймворков есть собственные списки рассылки и IRC-каналы; следует искать их на сайтах проектов.321