Pull to refresh

Nagare — новый подход к построению web-приложений

Reading time4 min
Views816
Путешествуя по просторам интернета в поисках свежих идей для очередного проекта, я случайно наткнулся на Nagare — революционный, как мне кажется, python-фреймворк, кардинально меняющий подход к разработке web-приложений. Кажется, на хабре еще не было обзора, пора это исправить.


Итак, с какими сложностями сталкивается разработчик web-приложения в первую очередь:
  • Необходимость сохранять данные между загрузками страниц
  • Обработка и сохранение данных, передаваемых пользователем через URL, GET/POST-запросы
  • Генерация валидного HTML/XML (например, правильное закрытие тэгов)
  • Интеграция кода, исполняемого на стороне клиента (JS/Ajax) с кодом, выполняемым на сервере
  • … и еще много-много разных вещей


Как вы сейчас убедитесь, использование Nagare позволит решать эти проблемы очень простыми и изящными способами. Сразу оговорюсь, что этим постом я не собираюсь давать краткий курс Nagare, а всего лишь проиллюстрировать интересный и свежий подход к web-программированию. Летчикам и танкистам стоит почитать документацию, благо, там понятно и без словоблудий все написано.

В функциональном программировании есть такое понятие, как continuations — продолжения. Если кратко, то функциональные языки позволяют программисту в любой момент получить мгновенный «снимок» программы и поместить его в переменную. Потом этот снимок можно «вызвать» и выполнение программы продолжится с того же места, где он был снят (с единственным исключением — возвращенное значение функции, которая делала снимок будет другим). Этот трюк позволяет строить весьма головоломные алгоритмы, поражающие своей красотой, после того, как будет потрачено пара часов/дней/лет на их подробный разбор. Но мы сейчас не об этом. Тот же трюк позволил разработчикам Nagare отойти от «сессионности», свойствнной web-приложениям. Приложение, построенное на основе Nagare практически ничем не отличается от обычного — прерывания, связанные с загрузкой страниц пользователем, как бы прозрачно «маскируются» фреймворком, работающим через «продолжения». Вам не надо заботиться о сохранении данных, просто присваивайте значения переменной (или полю объекта) и оно сохранится, пока существует сессия пользователя. Само. Например, после прохождения пользователем авторизации, вы просто пишете:

  AuthOk=True


а потом проверяете:

  if AuthOK:
    .......


Profit? Profit! Но это еще не все. Зачем разработчику знать и помнить о каких-то URL-ях? Нужно выдать пользователю ссылку с текстом, а когда он на нее кликнет — вывести на экран нужный текст. В Nagare это делается так:

h<<h.a("Это ссылка").action(my_link_action)


Эта строка сгенерирует ссылку с каким-то (ну какая нам разница, с каким?) URL, при клике на который будет вызвана процедура my_link_action(), определенная где-нибудь ранее. В процедуре можно изменить какие-нибудь переменные, основываясь на которых будет генерироваться страница. Если нужно создать форму ввода, то Nagare также позволяет сделать это без особых затей:

with h.form().action(f_act1):
  h<<h.input(type="text", value="").action(set_val1)
  h<<h.input(type="text", value="").action(set_val2)
  h<<h.input(type="submit", value="Послать!").action(s_act1)


Пользователь получит форму с двумя полями (ну какая разница, какие у них там аттрибуты name?) и submit-кнопку. После заполнения (введя в поля «blablabla» и «hehehe») и нажатия кнопки будут вызваны set_val1(«blablabla»), set_val2(«hehehe»), f_act1() и s_act1(). Все. Введенные данные у вас, делайте с ними что хотите. Можно еще упростить задачу — незачем делать отдельную функцию на каждый input. Программист ленив и он имеет на это право — его рабочее время стоит дороого. Пусть Nagare положит значения полей прямо в переменные! Делается это так:

v1=var.Var("")
v2=var.Var("")

with h.form().action(f_act1):
  h<<h.input(type="text", value="").action(lambda v: v1(v))
  h<<h.input(type="text", value="").action(lambda v: v2(v))
  h<<h.input(type="submit", value="Послать!").action(s_act1)


Вуаля — v1() нам вернет «blablabla», а v2() — «hehehe»!

Кстати, вы обратили внимание на то, что мы как-то не писали никакого HTML? А зачем это нам? Пусть HTML дизайнер пишет, ему за это деньги платят. Да и тэги закрывать еще. Nagare избавляет программиста от этой нудной обязанности. Например, создадим таблицу:

with h.table:
  with h.tr:
    with h.td:
      h<<"111"
    with h.td:
      h<<"222"
  with h.tr:
    with h.td:
      h<<"333"
    with h.td:
      h<<"444"


Красиво? Будете еще наезжать на питон с его выделением блоков отступами? То-то!

Так, что там у нас еще осталось? Ajax? Можно и Ajax. Кстати, зачем программисту знать про какой-то там Ajax? Логика работы программы же не меняется, Ajax там или не Ajax. Те же поля, ссылки, страницы, блоки, контент и пр. Просто они обновляются не целиком а частями. Какое дело программисту до того, как оно там обновляется? Перевод проекта на Ajax в Nagare делается так:
в одном месте программы

xhtml.Renderer(h)

заменяем на
xhtml.AsyncRendrer(h)


… и у нас сразу везде Ajax! Кому не нравится, может обратно отключить.
Там еще много всяких фишек, типа динамической трансляции python->javascript, шаблонов, компонентной модели, баз данных (через sqlalchrmy/elixir) и т.п. Со всем этим можно ознакомиться на сайте. Там же есть и примеры. В общем — you are welcome!

P.S. Есть, разумеется, и подводные камни. Например, вам потребуется устаносить stackless python. Но, верьте мне — этот фреймворк того стоит! В комментах, если что, можно задавать вопросы. Я не особый гуру в Nagare, но достаточно много с ней игрался.
Tags:
Hubs:
Total votes 19: ↑14 and ↓5+9
Comments30

Articles