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 к чсв, имхо, оно того стоит :).
А мораль сей басни такова: надо завязывать пить по утрам в понедельник, а то коллеги не понимают.