LINUX.ORG.RU

bottle vs pyramid vs все-все-все

 , , ,


0

2

UP: код в топике нафиг не нужен т.к. всё это есть в bottle, надо просто было доки читать внимательнее и больше гуглить

Здравствуйте мои дорогие любители похапэ и жабаскрипт. У меня кончились дедлайны, так что теперь я могу заняться лором :). Давече попросили знакомые кое-какой софтец для больницы налабать (название не скажу, хочу чтобы вам было страшно). Софт под винду писать не умею, зато у меня есть домашняя страничка из которой я начал выдирать куски для веб-интерфейса приложения. И вот как-то всё достигло апофегея когда фич стало страшно не хватать и я задумался о переезде на pyramid. Я посмотрел на What Makes Pyramid Unique. Давно я так не ржал. Вот основные фичи которые идут вначале:

  • Single-file applications

    You can write a Pyramid application that lives entirely in one Python file

  • Decorator-based configuration
  • Class-based and function-based views

Ну итд. Просто уникальнейшие фичи, да :)

Внимательный читатель понял что некоторые фичи в списке я сознательно упустил т.к. их таки нет в бутылке. Вот об этом и поговорим :).

Я ознакомился целиком с этим документом и понял что могу сделать сам, причём достаточно быстро и абсолютно прозрачно.

Наугад взял две веши.

1) Модульные приложения.

#settings.py
MODULES = ['wiki', 'blog', 'monitoring', 'paste', 'upload']

#site.py (в main())
modules = []
for module_name in MODULES:
    module = __import__(module_name)
    modules.append(module)
    if hasattr(module, "init"):
        module.init()

Хоть модуль, хоть package, будет работать тип-топ. Правда, потом узнал что в бутылке такой функционал есть, доки что-ли почитать.

2) Именованные локейшены.

Сначала я испугался, задача выглядела сложновато. А потом подумал что проблема простая, надо просто сделать маппинги названий, регекспов урлов (типа '/blog/{id}/') и вьюшек. После того как я сделал я понял что в бутылке это всё есть, только почему-то недокументировано (я исправлю это). Итак:

from bottle import get, redirect, default_app
app = default_app()
#named redirect
def nredirect(name, *args, code=None, **params):
    url = app.router.build(name, *args, **params)
    redirect(url, code=code)

Благо 3тыщи строк высококачественного кода распарсить было относительно легко и времени это не заняло. Код, как и положено, умеет передавать GET-параметры.

3) ну и надо бы каждому модулю свой префикс урлов сделать. Сказано - сделано:

class BaseRouter:
    __prefix__ = ''
    def __init__(self, url, tpl=None, **kwargs):
        self.url = self.__prefix__ + url
        self.tpl = tpl
        self.kwargs = kwargs

    def __call__(self, f):
        if self.tpl:
            f = mako_view(self.tpl)(f)
        f = route(self.url, **self.kwargs)(f)
        return f

class myroute(BaseRouter):
    __prefix__ == '/' + __name__

@myroute('/view/', tpl="template", method='GET')
def view():
    return dict(content="Hello, Hell")

Очевидно что префиксы можно выставлять хоть на этапе инициализации модуля, хоть прописывать в settings.py, хоть на лету менять.

Так вот, к чему это я. У меня слишком много свободного времени. Главное голова на плечах, а не наличие мега-фреймворка который якобы всё за тебя может сделать.

Минусы тоже есть: 1) отсутствие стандартизации, каждый лепит свои костыли^Wнавороты 2) некоторое время уходит на дописывание функционала, но, ящитаю, для профи это буквально пара часов оверхеда. Зато +500 к чсв, имхо, оно того стоит :).

А мораль сей басни такова: надо завязывать пить по утрам в понедельник, а то коллеги не понимают.

★★★★★

Последнее исправление: true_admin (всего исправлений: 3)

надо было покороче написать. Так и знал что никто не будет читать.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Просто пирамид осилятров на лоре маловато.

zz ★★★★
()

ты зачеркнул самые толковые слова в своем топике :)

Virtuos86 ★★★★★
()

tl;dr: ТС считает, что фреймворки не нужны, т.к. все можно написать руками.

power
()

о чем ты хотел поведать? Если ты про то, что в бутылке есть все, то раз уж много времени, то посмотри когда это было реализовано в django, bottle.py и pyramid.

xpahos ★★★★★
()

ну что ты, покричал про похапэщников, а симфони в рассмотрение не добавил

shty ★★★★★
()
Ответ на: комментарий от xpahos

посмотри когда это было реализовано в django, bottle.py и pyramid.

Зачем?

В бутылке как раз мало чего есть, но это, по крайней мере в моём случае, не является большим препятствием.

true_admin ★★★★★
() автор топика

могу сделать сам

Это означает, что задача слишком проста при таким размере батареек. Собственно потому(в т.ч.) этих фреймворков столько понаписали.

Главное голова на плечах, а не наличие мега-фреймворка который якобы всё за тебя

То, что ты это можешь, не означает, что оно стОит, т.к. оно плохо масштабируется. Скажем, если ты захочешь писать по N сайтов в день, O(N) coderов, не знающих почти ничего за пределами фреймворка тебе помогут, а голова на плечах - наоборот помешает, т.к. не интересно будет изобретать одинаковые фреймворки с такой частотой.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

не знающих почти ничего за пределами фреймворка

нафуй таких

не интересно будет изобретать одинаковые фреймворки с такой частотой.

так наработки шарятся между проектами. Я изобретаю велосипеды только после тщательного гуглежа.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

так все равно тебе делать нечего. Сделай рисеч.

xpahos ★★★★★
()

А как bottle по сравнению с flask?

ЗЫ. Про то, что сайты писать очень просто впринципе не удивил.

dizza ★★★★★
()
Ответ на: комментарий от dizza

А как bottle по сравнению с flask?

хз :). По-моему, примерно те же яйца, но исходников фласка не смотрел. Сходу я вижу отличия, но они непринципиальны. Я бутылку выбрал за то что она третий питон держит. фласк, судя по докам, всё ещё в пролёте.

Впрочем, у фласка есть поддержка тестов и сессий, нормальный context processing (превед, джанга, мать твою)... В общем, немного больше батареек.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от bismi

нафига нужен питон если есть C? нафига нужен C если есть ассемблер? Нафига компьютеры если есть счёты?

Разный уровень абстракции.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от bismi

1) чтобы понять эту самую разницу

2) чтобы понять необходимость в этой разнице

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

true_admin ★★★★★
() автор топика

Главное голова на плечах И наличие мега-фреймворка который всё за тебя сделает.

P.S. Да, я пишу на Rails и не стыжусь этого ;)

Alve ★★★★★
()
Ответ на: комментарий от true_admin

давай понимать вместе. Вот из чего состоит Pyramid

12K	asset.py
20K	authentication.py
8.0K	authorization.py
8.0K	chameleon_text.py
8.0K	chameleon_zpt.py
132K	config.py
4.0K	configuration.py
4.0K	decorator.py
4.0K	encode.py
12K	events.py
4.0K	exceptions.py
4.0K	httpexceptions.py
16K	i18n.py
4.0K	__init__.py
28K	interfaces.py
4.0K	location.py
4.0K	log.py
8.0K	mako_templating.py
8.0K	paster.py
4.0K	path.py
4.0K	registry.py
16K	renderers.py
16K	request.py
4.0K	resource.py
4.0K	response.py
12K	router.py
4.0K	scripting.py
12K	security.py
12K	session.py
8.0K	settings.py
12K	static.py
36K	testing.py
4.0K	threadlocal.py
36K	traversal.py
8.0K	urldispatch.py
20K	url.py
8.0K	util.py
16K	view.py
4.0K	wsgi.py
532K	total

bismi
()
Ответ на: комментарий от bismi

532K против 117К

но в пирамиде много комментариев, из которых строится документация, если сравнивать без комментариев разрыв будет не такой пятикратный

bismi
()
Ответ на: комментарий от bismi

Значит разрыв по функционалу тоже :)

true_admin ★★★★★
() автор топика
Ответ на: комментарий от bismi

я (частично) читал. Врага надо знать в лицо :)

true_admin ★★★★★
() автор топика
Ответ на: комментарий от bismi

А почему ты не учитываешь код в зависимостях ? Так что по факту пирамида ничуть не меньше по объему кода нежели джанго

yanka ★★
()
Ответ на: комментарий от true_admin

какой он маленький... Это хорошо.

Какой же он маленький, а зависимости, тот же webob и так далее...

Все вместе будет намного тяжелее джанги, кстати джанга тяжелая не из-за объема кода, а из-за i18n

yanka ★★
()
Ответ на: комментарий от yanka

Янка, молодец, я знал что победа будет за нами :).

true_admin ★★★★★
() автор топика
Ответ на: комментарий от DonkeyHot

Ого, вменяемые люди на ЛОРе?? Я опять обрел надежду, спасибо!

boombick ★★★★★
()
Ответ на: комментарий от DonkeyHot

Это все умозрения. 90% сложности программирования - в анализе и постановке задач и лишь 10% в инструментах. Можно на чем угодно разрабатывать, хоть на турбо паскале, все равно это ничто. Написать свой наколенный - тоже ничто. Изучить чужой наколенный - ничто. Мелочи все это.

dizza ★★★★★
()
Ответ на: комментарий от dizza

Ого, вменяемые люди на ЛОРе?? Я опять обрел надежду, спасибо!

:P

true_admin ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Понятное дело нужен ЯВУ. В машкодах можно нахерачить к примеру лисп и писать уже на нем. Тоже херня.

dizza ★★★★★
()
Ответ на: комментарий от true_admin

ответ знаю я! форт написать надо на машинных кодах!

А на нем уже лисп. OH SHI~, это же прославленная лекция Ксеноцефала!

tailgunner ★★★★★
()

Я посмотрел на What Makes Pyramid Unique. Давно я так не ржал.

Думаешь, она сами были прям таки серьёзны, когда писали это?

anonymous
()
Ответ на: комментарий от dizza

90% сложности программирования - в анализе и постановке задач и лишь 10% в инструментах ... Написать свой наколенный - тоже ничто.

do the math. Час на написание своего = + 9 на анализ, постановку, etc.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

А вот, кстати, для меня кодинг перестал быть большой проблемой. Если в голове всё сидит то переложить в текст не вопрос. Я поддерживаю dizza в том что основное время проводитсяя не за стучанием клавишь. Иначе бы при скорости пускай даже 200символов в минуту я бы по 700кб кода в час писал.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от yanka

pyramid использует webob как абстракцию над HTTP, flask импользует Веркезук, bottle свои тонкие обертки, django использует свои обертки.

вообще на сайте bottle прочел что он позиционируется как инструмент для быстрого создания прототипа.

Pyramid же позиционируется как серьезный, масштабируемый фреймворк для создания веб-приложений. И при этом он позволяет делать однофайловые приложения, читай теже прототипы.

bismi
()
Ответ на: комментарий от bismi

Быстрый прототип он не про однофайловые приложения, а про время потраченное на необходимый бойлерплейт код для фреймворка.

zz ★★★★
()
Ответ на: комментарий от bismi

pyramid использует webob как абстракцию над HTTP, flask импользует Веркезук, bottle свои тонкие обертки, django использует свои обертки.

webob как и bottle используют cgi из стандартной библиотеки python

у werkzeug свой механизм парсинга http запроса.

Особой принципиальной разницы нет. Раньше считалось что библиотека cgi не без глюков. Вот автор werkzeug написал свой вариант парсинга. Но в последних версиях python особенно в python 3.2 она было основательно переработана.

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

yanka ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.