Путешествуя по просторам интернета в поисках свежих идей для очередного проекта, я случайно наткнулся на Nagare — революционный, как мне кажется, python-фреймворк, кардинально меняющий подход к разработке web-приложений. Кажется, на хабре еще не было обзора, пора это исправить.
Итак, с какими сложностями сталкивается разработчик web-приложения в первую очередь:
Как вы сейчас убедитесь, использование Nagare позволит решать эти проблемы очень простыми и изящными способами. Сразу оговорюсь, что этим постом я не собираюсь давать краткий курс Nagare, а всего лишь проиллюстрировать интересный и свежий подход к web-программированию. Летчикам и танкистам стоит почитать документацию, благо, там понятно и без словоблудий все написано.
В функциональном программировании есть такое понятие, как continuations — продолжения. Если кратко, то функциональные языки позволяют программисту в любой момент получить мгновенный «снимок» программы и поместить его в переменную. Потом этот снимок можно «вызвать» и выполнение программы продолжится с того же места, где он был снят (с единственным исключением — возвращенное значение функции, которая делала снимок будет другим). Этот трюк позволяет строить весьма головоломные алгоритмы, поражающие своей красотой, после того, как будет потрачено пара часов/дней/лет на их подробный разбор. Но мы сейчас не об этом. Тот же трюк позволил разработчикам Nagare отойти от «сессионности», свойствнной web-приложениям. Приложение, построенное на основе Nagare практически ничем не отличается от обычного — прерывания, связанные с загрузкой страниц пользователем, как бы прозрачно «маскируются» фреймворком, работающим через «продолжения». Вам не надо заботиться о сохранении данных, просто присваивайте значения переменной (или полю объекта) и оно сохранится, пока существует сессия пользователя. Само. Например, после прохождения пользователем авторизации, вы просто пишете:
а потом проверяете:
Profit? Profit! Но это еще не все. Зачем разработчику знать и помнить о каких-то URL-ях? Нужно выдать пользователю ссылку с текстом, а когда он на нее кликнет — вывести на экран нужный текст. В Nagare это делается так:
Эта строка сгенерирует ссылку с каким-то (ну какая нам разница, с каким?) URL, при клике на который будет вызвана процедура my_link_action(), определенная где-нибудь ранее. В процедуре можно изменить какие-нибудь переменные, основываясь на которых будет генерироваться страница. Если нужно создать форму ввода, то Nagare также позволяет сделать это без особых затей:
Пользователь получит форму с двумя полями (ну какая разница, какие у них там аттрибуты name?) и submit-кнопку. После заполнения (введя в поля «blablabla» и «hehehe») и нажатия кнопки будут вызваны set_val1(«blablabla»), set_val2(«hehehe»), f_act1() и s_act1(). Все. Введенные данные у вас, делайте с ними что хотите. Можно еще упростить задачу — незачем делать отдельную функцию на каждый input. Программист ленив и он имеет на это право — его рабочее время стоит дороого. Пусть Nagare положит значения полей прямо в переменные! Делается это так:
Вуаля — v1() нам вернет «blablabla», а v2() — «hehehe»!
Кстати, вы обратили внимание на то, что мы как-то не писали никакого HTML? А зачем это нам? Пусть HTML дизайнер пишет, ему за это деньги платят. Да и тэги закрывать еще. Nagare избавляет программиста от этой нудной обязанности. Например, создадим таблицу:
Красиво? Будете еще наезжать на питон с его выделением блоков отступами? То-то!
Так, что там у нас еще осталось? Ajax? Можно и Ajax. Кстати, зачем программисту знать про какой-то там Ajax? Логика работы программы же не меняется, Ajax там или не Ajax. Те же поля, ссылки, страницы, блоки, контент и пр. Просто они обновляются не целиком а частями. Какое дело программисту до того, как оно там обновляется? Перевод проекта на Ajax в Nagare делается так:
в одном месте программы
заменяем на
… и у нас сразу везде Ajax! Кому не нравится, может обратно отключить.
Там еще много всяких фишек, типа динамической трансляции python->javascript, шаблонов, компонентной модели, баз данных (через sqlalchrmy/elixir) и т.п. Со всем этим можно ознакомиться на сайте. Там же есть и примеры. В общем — you are welcome!
P.S. Есть, разумеется, и подводные камни. Например, вам потребуется устаносить stackless python. Но, верьте мне — этот фреймворк того стоит! В комментах, если что, можно задавать вопросы. Я не особый гуру в Nagare, но достаточно много с ней игрался.
Итак, с какими сложностями сталкивается разработчик 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, но достаточно много с ней игрался.