Pylons Framework
Расскажу я вам, дорогие мои читатели, о замечательном веб-фреймворке Pylons(язык Python). Непонятно почему он был так обделен вниманием на хабре. Постараюсь исправить такую несправедливость. Я считаю его лучшим и попытаюсь вам раскрыть многие его прелести.
Pylons создавался с оглядкой на популярные решения, так говорит нам wiki. Но по личному опыту скажу вам, что основные идеи были взяты из Ruby On Rails и улучшены!
Pylons активно использует внешние компоненты:
Практиковал только алхимию, по этому про неё и примеры.
Опишем нашу модель:
Используем:
Routes точная копия рельсового аналога. За исключением работы с поддоменами. Хотя я уверен это скоро появится и в других фреймворках.
Пример настройки маршрутов:
Используем:
P.S.
Про шаблоны сказать особо нечего, рельсовая философия – писать питон код в них можно, хотя и не стоит, но для тестов удобно. А вот формы это другое дело, но это в следующий раз.
Спасибо за внимание.
Pylons создавался с оглядкой на популярные решения, так говорит нам wiki. Но по личному опыту скажу вам, что основные идеи были взяты из Ruby On Rails и улучшены!
Pylons активно использует внешние компоненты:
- ORM: SQLAlchemy, SQLObject, CouchDB
- Шаблоны: Mako, Genshi, Jinja2
- Вставка фрагментов HTML: WebHelpers
- Генераторы форм: FormAlchemy, FormEncode, ToscaWidgets
- Маршрутизация запросов: Routes
Работа с моделью
Практиковал только алхимию, по этому про неё и примеры.
Опишем нашу модель:
Copy Source | Copy HTML
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(100))
password = Column(String(40))
post_keywords = Table('post_keywords', metadata,
Column('post_id', Integer, ForeignKey('posts.id')),
Column('keyword_id', Integer, ForeignKey('keywords.id'))
)
class BlogPost(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id', ondelete="CASCADE"))
title = Column(String(200), nullable=False)
body = Column(Text, nullable=False)
update_date = Column(DateTime, onupdate=func.now(), default=func.now())
create_date = Column(DateTime, default=func.now())
author = relation(User, backref='addresses')
keywords = relation('Keyword', secondary=post_keywords, backref='posts')
class Keyword(Base):
__tablename__ = 'keywords'
id = Column(Integer, primary_key=True)
keyword = Column(String(50), nullable=False, unique=True)
Используем:
Copy Source | Copy HTML
# создадим Машу
user = User(name=u"Маша")
user.password = sha1("12345").hexdigest()
session.add(user)
# найдем Машу
masha = session.query(User).filter_by(name=u"Маша").first()
# создадим пост
post = BlogPost(title=u"Мой первый пост", body="Я люблю печеньки",user = masha)
# добавим ключевое слово
post.keywords.append(Keyword(keyword='cookies'))
# удалим Машу
session.delete(masha)
# удалим всех, кто начинается на букву А, используя "продвинутую" алхимию
tUser = User.__table__
session.execute(tUser.delete().where(tUser.c.name.like(u'А%')))
Маршрутизация
Routes точная копия рельсового аналога. За исключением работы с поддоменами. Хотя я уверен это скоро появится и в других фреймворках.
Пример настройки маршрутов:
Copy Source | Copy HTML
# именование
map.connect("user_info", "/users/:name/info", controller="account", action="info")
# submappers и префикс
with map.submapper(controller="blog", path_prefix="/blog/") as blog:
# использование regexp
blog.connect(R"{id:\d+}", action="show")
# REST-стиль
blog.connect("create", action="create", conditions=dict(method=["POST"]))
blog.connect("update", action="update", conditions=dict(method=["PUT"]))
Используем:
Copy Source | Copy HTML
url_for("user_info", name="vlad") => "/users/vlad/info"
url_for(controller="blog", action="show", id="5") => "/blog/5"
P.S.
Про шаблоны сказать особо нечего, рельсовая философия – писать питон код в них можно, хотя и не стоит, но для тестов удобно. А вот формы это другое дело, но это в следующий раз.
Спасибо за внимание.



комментарии (50)