Cowboy + Session

359 views
Skip to first unread message

DarkIT

unread,
May 24, 2013, 4:09:39 PM5/24/13
to erlang-...@googlegroups.com
А в сабже что-ли нету поддержки сессий из коробки и надо самому писать что то?

П.С. есть ли в ерланге возможность в рантайме рефлексия и динамик прокси как в джаве? Там удобно делать всякие логгеры/оборачивать методы в транзакции и тд?

Maxim Sokhatsky

unread,
May 24, 2013, 4:45:43 PM5/24/13
to erlang-...@googlegroups.com
Все методы в эрланге итак обернуты в транзакции.
Это называется ген_сервер.


Date: Fri, 24 May 2013 13:09:39 -0700
From: dar...@gmail.com
To: erlang-...@googlegroups.com
Subject: Cowboy + Session


А в сабже что-ли нету поддержки сессий из коробки и надо самому писать что то?

П.С. есть ли в ерланге возможность в рантайме рефлексия и динамик прокси как в джаве? Там удобно делать всякие логгеры/оборачивать методы в транзакции и тд?

--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
Правила, действующие в чате и рассылке: http://erlanger.ru/ru/erlang-at-conference-jabber-ru
 
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com
---
Вы получили это сообщение, поскольку подписаны на группу Erlang по-русски.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес erlang-russia...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
 
 

Andrey Sergienko

unread,
May 24, 2013, 5:08:29 PM5/24/13
to erlang-russian
Из коробки нету, надо писать самому. С другой стороны, там и писать особо нечего. Базовый пример: http://www.asergienko.com/handling-web-session-in-cowboy/

Andrey Sergienko

2013/5/24 DarkIT <dar...@gmail.com>

Maxim Sokhatsky

unread,
May 24, 2013, 5:26:26 PM5/24/13
to erlang-...@googlegroups.com
Вот как у меня в N2O:

DarkIT

unread,
May 24, 2013, 5:49:18 PM5/24/13
to erlang-...@googlegroups.com
:) Так можно и про веб сервер сказать - сколько там кода в том ковбое :)
Спасибо за пример.

DarkIT

unread,
May 24, 2013, 5:49:30 PM5/24/13
to erlang-...@googlegroups.com
Спасибо - посмотрю

DarkIT

unread,
May 24, 2013, 5:56:49 PM5/24/13
to
Может у меня голова еще в рамках ООП работает - но если расмотреть такой пример
Есть UserHome.saveUser и PostHome.savePost и отдельный класс SomeService.makeAction () {... userHome.saveUser(..);postHome.savePost(...);....}
Через спринг вешаем транзакционность на эти методы и можно вызывать как отдельные методы saveUser и если нет транзакции БД то сделается новая или есть он вызван в рамках метода сервиса то после отработки saveUser транзакция не будет закомичена, а только после завершения makeAction.

Как такое правильно и красиво реализовывается на ерланге?

Roman Chvanikoff

unread,
May 24, 2013, 6:53:54 PM5/24/13
to erlang-...@googlegroups.com
Только недавно переписал старый cowboy_session от Spawngrid: https://github.com/chvanikoff/cowboy_session

суббота, 25 мая 2013 г., 0:09:39 UTC+4 пользователь DarkIT написал:

Max Lapshin

unread,
May 25, 2013, 4:50:37 AM5/25/13
to erlang-...@googlegroups.com
К счастью, эрланг не позволяет делать таких страшных вещей, как
открытие втихаря транзакций какой-то строчкой где-то в XML.

Если вам нужны транзакции, то явно открывайте и используйте.

Так же, к счастью, в ковбое нет никаких штатных сессий, потому что для
разных задач они нужны сильно разные. Где-то вполне хватает cookie
session, где-то делают шаренные сессии с серверным хранением. Но,
наверное, если привыкнуть к тому, что сессии магически включаются
парой сотен строк XML конфигурации, то такой подход непривычен.

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

DarkIT

unread,
May 25, 2013, 5:36:51 AM5/25/13
to erlang-...@googlegroups.com


On Saturday, May 25, 2013 11:50:37 AM UTC+3, Max Lapshin wrote:
К счастью, эрланг не позволяет делать таких страшных вещей, как
открытие втихаря транзакций какой-то строчкой где-то в XML.


Он запросто позволяет делать parse_transform, который для меня выглядит гораздо менее прозрачный чем транзакционная анотация в Джаве.
 
Если вам нужны транзакции, то явно открывайте и используйте.

Получается мешанина из бизнес логики и доступа к БД, да и выглядит для понимания/поддержки/тестирования проще такой метод
@Transactional 
long saveUser(String name, String passwd) {....}
чем 
long saveUser(String name, String passwd, Connection conn) {
Transaction trans =conn.getCurrentTransaction()
boolean isNewTrans = false;
if(null == trans) {
trans = conn.createNewTransaction(); 
isNewTrans = true;
}
try {
....

if(isNewTrans) {
 trans.commit();
}
} catch(MyException e) {
trans.rollback();
}
 



Так же, к счастью, в ковбое нет никаких штатных сессий, потому что для
разных задач они нужны сильно разные. Где-то вполне хватает cookie
session, где-то делают шаренные сессии с серверным хранением. Но,
наверное, если привыкнуть к тому, что сессии магически включаются
парой сотен строк XML конфигурации, то такой подход непривычен.

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

Только в этом треде мне показали три варианта решения сессий - те люди потратили свое время на делание одного и того же.
В моем понимании делать веб сервер без сессий в 21 веке моветон. Мне думается правильней было бы сделать один простой механизм для одного сервера где данные хранятся в памяти и иметь behaviour и список callbacks, реализовав которые можно менять имплементацию.
А так надо самому реализовывать простейший вариант, потом следить если куки отключены, то передавать сессию через урл.

 

Max Lapshin

unread,
May 25, 2013, 5:41:56 AM5/25/13
to erlang-...@googlegroups.com
У тебя крайне неправильное понимание того, как и зачем используются
веб-сервера на эрланге, если ты так думаешь про сессии.

Я тебе гарантирую, что что бы ты ни придумал сейчас с сессиями, во
всех моих проектах было бы непригодно.

Danil A. Zagoskin

unread,
May 25, 2013, 6:34:12 AM5/25/13
to erlang-...@googlegroups.com
Мне кажется, вы путаете HTTP-сервер и веб-фреймворк. Возьмите, например, нитроген и возрадуйтесь нескольким неплохо документированным способам хранения сессионных данных.


25 мая 2013 г., 13:36 пользователь DarkIT <dar...@gmail.com> написал:

Только в этом треде мне показали три варианта решения сессий - те люди потратили свое время на делание одного и того же.
В моем понимании делать веб сервер без сессий в 21 веке моветон. Мне думается правильней было бы сделать один простой механизм для одного сервера где данные хранятся в памяти и иметь behaviour и список callbacks, реализовав которые можно менять имплементацию.
А так надо самому реализовывать простейший вариант, потом следить если куки отключены, то передавать сессию через урл.

 

--

Maxim Sokhatsky

unread,
May 25, 2013, 7:27:25 AM5/25/13
to erlang-...@googlegroups.com
В Нитрогене медленный сессии, не зря же я их переписывал :-)
Да и хранить сессии лучше всего в ETS.


From: da...@st-olen.ru
Date: Sat, 25 May 2013 14:34:12 +0400

Subject: Re: Cowboy + Session

Maxim Sokhatsky

unread,
May 25, 2013, 7:31:23 AM5/25/13
to erlang-...@googlegroups.com
Кроме того в Нитрогене не контролируется экспирейшиин на стороне сервера.


From: da...@st-olen.ru
Date: Sat, 25 May 2013 14:34:12 +0400
Subject: Re: Cowboy + Session
To: erlang-...@googlegroups.com

Michael Uvarov

unread,
May 26, 2013, 3:29:28 AM5/26/13
to erlang-...@googlegroups.com
long saveUser(String name, String passwd) {....}
да, код с многоточиями действительно проще.

save_user(Name, String) ->
       my_db:transaction(fun() -> ... end).


2013/5/25 DarkIT <dar...@gmail.com>

 

--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
Правила, действующие в чате и рассылке: http://erlanger.ru/ru/erlang-at-conference-jabber-ru
 
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com
---
Вы получили это сообщение, поскольку подписаны на группу Erlang по-русски.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес erlang-russia...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
 
 



--
С уважением,
Уваров Михаил.
Best regards,
Uvarov Michael

DarkIT

unread,
May 26, 2013, 3:40:01 AM5/26/13
to erlang-...@googlegroups.com
Да так красивей выглядит, а как быть если есть еще транзакционный метод сервиса 

SomeService:makeAction(...) {
...
saveUser(...);
saveSomething();
...
}

те транзакция должна быть открыта с начало  makeAction, сделан роллбек если возник ексепшен и в методах saveUser saveSomething транзакция не должна комититься, а только по окончанию метода makeAction

Michael Uvarov

unread,
May 26, 2013, 4:12:19 AM5/26/13
to erlang-...@googlegroups.com
Простейший случай как реализована функция transaction:
https://github.com/wg/epgsql/blob/master/src/pgsql.erl#L102
Т.е. там есть обработка ошибки и откат.
Тут транзакция открывается явно, не уверен, как дело просходит с
вложенными транзакциями.

Можно транзакцию создавать только один раз, на верхнем уровне и каждый
раз проверять, открыта ли транзакция.
https://github.com/arcusfelis/relatio/blob/master/src/relatio_db.erl#L188

Я предпочитаю из функций save_user/2 и подобных упоминание о транзакциях
убрать и вызывать транзакции явно, где они нужны. Так как такую функцию
не должно волновать, как открыта транзакция, важно, что она была открыта.

DarkIT

unread,
May 26, 2013, 7:16:48 AM5/26/13
to erlang-...@googlegroups.com
"Можно транзакцию создавать только один раз, на верхнем уровне и каждый 
раз проверять, открыта ли транзакция." -- как это делается в ерланге?
Я вижу это двумя вариантами
- стандартный - транзакция открывается и сохраняется в виде общедоступного ресурса, в джаве можно засунуть в ThreadLocal переменную, в ерланге как быть?
- путь ерланга(в моем понимании) - создать процесс в который передавать запросы - нормально ли решение?

может есть что то еще?

Michael Uvarov

unread,
May 26, 2013, 10:11:56 AM5/26/13
to
В Erlang с этим по-разному. Можно засунуть влажок в process state текущего процесса, но это спорное решение, хоть и красивое. Так вроде сделано в Mnesia.
Это может так же обрабатываться в Erlang-процессе, контролирующем соединение.

Max Lapshin

unread,
May 26, 2013, 8:50:13 AM5/26/13
to erlang-...@googlegroups.com
Слава богу, что мне не приходится работать с кодом, который пихает
флажок транзакции в ThreadLocal.

Подобные данные хранятся в передаваемых в функцию аргументах.

В частности, с тем же ковбоем, в поле запроса есть meta, в которую
можно положить данные с помощью middleware.

DarkIT

unread,
May 26, 2013, 9:57:30 AM5/26/13
to erlang-...@googlegroups.com
Кодировка побилась, ничего не понятно

On Sunday, May 26, 2013 3:46:32 PM UTC+3, Michael Uvarov wrote:
О©╫ Erlang О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫-О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ process state
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ Mnesia.
О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ Erlang-О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.

Michael Uvarov

unread,
May 26, 2013, 10:14:11 AM5/26/13
to erlang-...@googlegroups.com

DarkIT

unread,
May 26, 2013, 10:22:19 AM5/26/13
to erlang-...@googlegroups.com
Примерно как я и описал - спасибо


On Sunday, May 26, 2013 3:46:32 PM UTC+3, Michael Uvarov wrote:

Trofim Jugastrov

unread,
May 27, 2013, 5:12:14 AM5/27/13
to
Подскажите пожалуйста, а такой подход нормален или есть какая-то стандартная реализация.
(Если не правильно, объясните пожалуйста, почему)

cowboy_http_handler 2-х видов: авторизация/регистрация и точка входа приложения
1-й регает нового пользователя или авторизует существующего, выделяет ему новый процесс под сессию и в ets пишет {Key, Pid}
(сессия живёт в отдельном процессе, берёт стейт из базы и в конце кладёт стейт в базу, завершается если нет запросов больше, чем заданный интервал)
2-й принимает запросы, достаёт данные (или команду), по ключу Key достаёт Pid из ets, отправляет сообщение на этот Pid, в ответ получает либо ок либо данные (возможно какие-то команды с сервера)

Вся логика обрабатывается внутри сессионного модуля. 
Reply all
Reply to author
Forward
0 new messages