Как использовать Python для веб-разработки, не полагаясь на фреймворк?

Я знаю, что у различных фреймворков есть свои преимущества, но лично я хочу, чтобы моя веб-разработка на python была как можно более простой: меньше писать в фреймворк, больше писать на Python .

Единственное, что я нашел до сих пор, что позволяет мне делать это наиболее очевидным способом, - это web.py, но у меня есть небольшие опасения по поводу его производительности.

Для тех из вас, кто использует nginx (или другой вариант) + mod_wsgi + web.py ... как производительность? Можно ли его улучшить дальше?

Для тех из вас, кто использовал web.py, понравилась идея, и они написали что-то получше или нашли что-то получше ... не могли бы указать мне источник?

Я хотел бы услышать обо всех заметных, минималистичных, но мощных подходах.

Ответов (10)

Решение

Забавно, что даже при появлении вопроса о том, как писать без фреймворка, все продолжают продвигать свой любимый фреймворк. ОП жалуется, что не хочет «тяжелой структуры», а в ответах упоминается Twisted ? Пойдемте, правда.

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

Чтобы пойти по этому пути, вы, как правило, должны быть знакомы с основами HTTP и CGI (поскольку WSGI унаследовал очень многое от этой более ранней спецификации). Это не обязательно рекомендовать новичкам, но это вполне выполнимо.

Я хотел бы услышать обо всех заметных, минималистичных, но эффективных подходах

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

Почему вас беспокоит производительность web.py? Как я уже упоминал здесь , мы используем CherryPy (веб-сервер, «встроенный» в web.py) за nginx для обслуживания большей части HTML на Oyster.com - nginx разделяет трафик между 2 или 3 веб-серверами, на каждом из которых выполняется 4 процесса Python, и мы можем легко обрабатывать сотни запросов в секунду.

Oyster.com - это массовый веб-сайт, который в среднем дает 200 000 динамически генерируемых просмотров страниц в день и достигает гораздо более высоких показателей. Однако мы используем сеть доставки контента (CDN) для наших статических ресурсов, таких как изображения и CSS.

Мы определенно заботимся о производительности (большинство наших страниц отображается менее чем за 25 мс), но web.py не является узким местом. Наши узкие места - это рендеринг шаблонов (мы используем Cheetah , который достаточно быстрый, но не очень быстрый) и запросы к базе данных (мы сильно кешируем и сохраняем количество запросов к базе данных на странице равным 0 или 1), а также доступ к нашим ценам на сторонние отели. провайдеры (они доступны, когда вы выполняете поиск по датам, которые мы еще не кэшировали).

Помните, что преждевременная оптимизация - это корень всех зол - если вы не обслуживаете google.com, web.py, вероятно, сработает для вас.

Мне очень нравится Google AppEngine. Я использую ORM и систему шаблонов, но в остальном следую шаблонному дизайну REST и просто реализую методы Python для соответствующих HTTP. Это делает необработанное HTTP-взаимодействие центральным и, при желании, дает вам другие возможности для использования. Кроме того, вам больше не нужно настраивать среду развертывания и управлять ею!

Как бы то ни было, я написал свой веб-сайт в mod_python без какой-либо промежуточной структуры, такой как Django. У меня действительно не было причин жаловаться. (Ну, может быть, немного, mod_python в некотором роде причудлив, но не в обычных случаях использования) Одно можно сказать наверняка, он определенно позволит вам написать Python ;-)

Что не так с Django? Это не заставляет вас использовать ORM, а контроллеры - это просто функции Python, а не методы классов, подобные Rails. Кроме того, маршрутизация URL-адресов выполняется с помощью регулярных выражений вместо другого синтаксиса, изобретенного фреймворком. Если вам все равно кажется, что django слишком много, я рекомендую взглянуть на Werkzeug

Вы также можете проверить Cherrypy . В центре внимания Cherrypy - это фреймворк, который позволяет писать на Python. Cherrypy имеет собственный довольно хороший веб-сервер, но он совместим с wsgi, поэтому вы можете запускать приложения Cherrypy в apache через mod_wsgi. Вот привет, мир в Cherrypy:

import cherrypy

class HelloWorld(object):
    def index(self):
        return "Hello World!"
    index.exposed = True

cherrypy.quickstart(HelloWorld())

Путь - это WSGI .

WSGI - это интерфейс шлюза веб-сервера . Это спецификация для веб-серверов и серверов приложений для взаимодействия с веб-приложениями (хотя ее можно использовать и для других целей). Это стандарт Python, подробно описанный в PEP 333 .

Все текущие фреймворки поддерживают wsgi. Многие веб-серверы также поддерживают его (включая apache через mod_wsgi ). Это правильный путь, если вы хотите написать свой собственный фреймворк.

Вот привет, мир, написанный непосредственно в wsgi:

def application(environ, start_response):
    status = '200 OK'
    response_headers = [('Content-type','text/plain')]
    start_response(status, response_headers)
    return ['Hello world!\n']

Поместите это в file.py, укажите на него свою mod_wsgi конфигурацию apache, и он запустится. Чистый питон. Нет импорта. Просто функция на питоне.

Если вы действительно пишете свой собственный фреймворк, вы можете проверить werkzeug . Это не фреймворк, а простой набор различных утилит для приложений WSGI, ставший одним из самых продвинутых служебных модулей WSGI. Он включает в себя мощный отладчик, полнофункциональные объекты запросов и ответов, HTTP-утилиты для обработки тегов сущностей, заголовки управления кешем, даты HTTP, обработку файлов cookie, загрузку файлов, мощную систему маршрутизации URL-адресов и множество дополнительных модулей, внесенных сообществом. Забирает скучную часть из ваших рук.

Я написал несколько небольших веб-приложений, использующих mod-python и PSP - эквивалент mod-python для php.

В одном случае я написал веб-страницу, которая генерирует примечания к выпуску, проверяя наш репозиторий исходного кода. Я переписал его на PHP и был удивлен, обнаружив, что версия для PSP была примерно на 20% быстрее, а также была примерно вдвое меньше строк кода.

Так что, по крайней мере, для небольших проблем, psp у меня хорошо сработал.

+1 ко всем ответам с WSGI.

Эрик Флоренцо недавно написал отличную запись в блоге, которую вы должны прочитать: « Написание невероятно быстрых, бесконечно масштабируемых утилит Pure-WSGI» . Это даст вам лучшее представление о чистом WSGI за пределами Hello World. Также обратите внимание на комментарии, особенно на первый комментарий Кевина Дангура, где он рекомендует хотя бы добавить WebOb в ваш набор инструментов.

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

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

Если вам нужно немного больше, например отображение URL-адресов в функции, тогда у вас есть несколько вариантов, некоторые из которых уже упоминались.

Если вы пойдете дальше, вы можете перейти к Pylons, Turbogears или Django, после этого, возможно, Zope, но он станет больше и, возможно, боль, а также вы всегда соглашаетесь с мнением этого фреймворка.

В последнее время я все чаще и чаще использую (исходящий от Zope / Plone) repoze.bfg . Он очень маленький, не поставляется с ORM в комплекте (поэтому вы можете использовать SQLAlchemy, Storm или просто перейти к базе данных объектов, такой как ZODB ). Что он делает, так это то, как вы переходите от URL-адреса к представлению, которое является функцией. Он поддерживает как сопоставление URL-адресов (а-ля маршруты), так и обход объекта, что, IMHO, очень мощно в некоторых случаях, особенно. если у вас не очень строгое отображение. Хорошо то, что он напрямую поставляется со структурой безопасности на основе ACL, которую можно использовать, если вы хотите, что IMHO очень практично иметь. Таким образом, вам не понадобятся декораторы, которые, кажется, используются в основном для таких вещей.

И, конечно же, он основан на WSGI. Также ищите репозиторий repoze subversion для довольно большого количества промежуточного программного обеспечения, и материал Paste также очень полезен для задач, связанных с WSGI.