четверг, 27 января 2011 г.

Как перейти c PHP на Python


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

Как работает php?
Для начала, примем во внимание, что PHP изначально задумывался и разрабатывался исключительно как язык для веб-разработки, и в 99.9% случаев для этого и используется (можно, конечно, писать и GUI-приложения, например, для этого есть GTK-биндинги).

Говоря о том, как работает PHP? я имею в виду то, как принято в большинстве случаев разрабfтывать веб-приложения на PHP. Я не буду углублятся в устройство интерпретатора, расширения, MINT, и т.д. Для пущей простоты примем интерпретатор PHP за некую отдельную сущность. В общем случае, все происходит примерно так:
То есть в самом простом случае, мы создаем html страницу, внутри которой находятся блоки PHP-кода, обрабатывающие запрос и генерирующие динамическое содержимое страницы. Первое, что PHP-программисты при переходе на python обычно делают (по крайней мере те, которые пользуются веб-сервером Apache):
  1. Ставят на Apache mod_python.
  2. Конфигурят директорию в httpd.conf.
  3. Добавляют туда скрипт с содержимым: print "Hello, world!".
  4. Запускают браузер и указывают URL якобы скрипта, например: "localhost/hello.py".
Такое - не работает.

Так что же насчет Python?
Опять же таки вернемся к истории. Исторически и практически Python является языком общего назначения, то есть не нацелен на какую-либо узкую область решения задач. Поэтому он не обладает встроенными средствами работы в веб-среде, как, например, работа с http-сессиями (в отличие от php). Поэтому вариант "создать страничку -> добавить блоки python-кода внутрь" не проканает.

Как разрабатываются веб-приложения на Python?

В отличии от PHP в Python нет стандартных механизмов работы с веб окружением (куки, сессия, и т.д.). Каждый фреймворк и подход имеют свои библиотеки для работы с этими вещами.

Вариант 1. Почти как в PHP. Называется это Python server pages - проект умер в зародыше, а кто так пишет подвергается в Python-сообществе остракизму. Возможен благодаря mod_python. Более детально можно почитать здесь.

Вариант 2. WSGI (web server gateway interface). Являет собой стандарт взаимодейтсвия веб-сервера и веб-приложения Python. В качестве веб-сервера можно использовать Apache с mod_wsgi, nginx с uWsgi, CherryPy и другие. На базе этого стандарта работают многие фреймворки для веб-разработки, в том числе и популярнейший из них - Django. В общем случае, для того, чтобы разрабатывать веб приложения, вам нужно обратится к документации к одному из этих фреймворков. Вот несколько из них:
Вариант 3. Неблокирующий веб-сервер и фреймворк к нему, которые написаны на Python. Имеют свои специфические API. Примеры:
  • Tornado
  • Zope3
  • Twisted (это скорее средство построения фреймворков и серверов)
Данные фреймворки написаны в стиле событийно-ориентированного программирования.

От себя
От себя порекомендую для начала разработки веб-приложений на Python обратится к одному из простых фреймворков, так называемых, микрофреймворков, например, Flask.

Полезные ссылки

8 комментариев:

  1. Краще б назвав "Как убить в себе PHP-шника" )))
    Але тут і без цього можна холівар розгорнути ))

    ОтветитьУдалить
  2. В статье вы совсем забыли про интерфейс FastCGI. Конкретно, в таком случае должна измениться схема генерации страницы, а именно: запуск интерпретатора осуществляется только один раз.

    ОтветитьУдалить
  3. Да, совершенно верно, но в данном случае это не принципиально, так как я хотел акцентировать внимание на разнице в подходах к написанию приложений. Так как (кроме оптимизаций) fastCGI и CGI реализуют одинаковый принцип работы, я эту деталь упустил.

    ОтветитьУдалить
  4. Хорошо, что я никогда не был php-шником - никого ненадо убивать )))

    PS: Ошибка в названии веб-сервера "Tornado".

    ОтветитьУдалить
  5. Хм...php вроде уделывает питон по скорости

    ОтветитьУдалить
  6. Очень сильное заявление. На каких функциях испытывали? в каких окружениях? пользовались ли профайлерами? если да, то как их настраивали в PHP и Python? очень было бы интересно посмотреть...
    Давайте похоливарим. Я первый: http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=python&lang2=php

    ОтветитьУдалить
  7. Можно ещё bottle посоветовать в качестве микро фреймворка.
    Насчёт того что РНР уделывает пайтон - миф. В вебе главное скорость разработки и читабельность кода, так кто здесь выигрывает?

    ОтветитьУдалить
  8. Helm2004, bottle есть в списке, идет сразу после Flask.

    ОтветитьУдалить

В этом гаджете обнаружена ошибка