Комментарии 22
class Dummy(object):
pass
django_request = Dummy()
django_request.session = session
вот почему-то мне всегда не нравится такой код, тем более есть namedtuple для таких вещей
0
Не слишком сложно с асинхронной частью? Имхо можно было бы заменить redis+tornadio на один RabbitMQ
www.rabbitmq.com/blog/2012/05/14/introducing-rabbitmq-web-stomp/
www.rabbitmq.com/blog/2012/05/14/introducing-rabbitmq-web-stomp/
+1
В
emit
можно просто передать dict и на клиенте получить объект, и не надо будет делать msg = JSON.parse(msg);
+2
В начале вы говорите, что не хотите писать на торнадо, а потом берете и юзаете его :(
0
какой из меня гуру, ну спасибо конечно) По поводу слайдов небольшая история. Я в проекте занимался примерно тем, что там на слайдах; было интересно, и примерно за месяц до начала конференции заявку на DevConf отправил — думал, как раз за месяц в тонкостях доразбираюсь. Но как отправил, проект сразу накрылся (по нетехническим причинам), и в итоге ничего в продакшн не пошло, а я другими вещами занялся. Так что на практике не знаю, хороший ли там подход, или плохой, и доклад пришлось рассказывать по теме, в которой опыта почти нет (доклад был ужасным). В слайдах есть пара штук, которые точно лучше поправить (вместо порта лучше использовать поддомен + вместо socket.io лучше socks.js + магия там экспериментальная). Авторы socket.io, похоже, больше самопиаром занимаются (успешно), чем тем, чтоб код работал.
С другой стороны, основная идея (что не нужно все переписывать, и лучший вариант часто — это синхронный фреймворк + асинхронный сервер отдельно) мне все еще кажется правильной и заслуживающей бОльшего внимания. Недавно вот Armin Ronacher про то же самое писал: lucumr.pocoo.org/2012/8/5/stateless-and-proud/
С другой стороны, основная идея (что не нужно все переписывать, и лучший вариант часто — это синхронный фреймворк + асинхронный сервер отдельно) мне все еще кажется правильной и заслуживающей бОльшего внимания. Недавно вот Armin Ronacher про то же самое писал: lucumr.pocoo.org/2012/8/5/stateless-and-proud/
+2
Спасибо, ознакомлюсь — Армин знает что пишет. В любом случае и этот метод вполне рабочий оказался… И на питоне — что особенно удобно.
0
Прочитал Армина, собственно он это и описал, только тут Django вместо flask…
0
В pdf-ке на выбор идёт node.js и tornado. Что в итоге в дело пошло?
0
Добавил вариант с sockjs
0
А не использовали ли вы WSS (WebSocketSecure) с поддержкой SSL
У меня проблемы с самоподписанным сертификатом в Safari он там выдает странную ошибку и переходит в режим XHR.
Я настраивал через Nginx Tcp proxy это дело, т.е. Nginx у меня занимался SSL шифрованием и после проксированием к tornadio2
Спасибо за статью.
У меня проблемы с самоподписанным сертификатом в Safari он там выдает странную ошибку и переходит в режим XHR.
Я настраивал через Nginx Tcp proxy это дело, т.е. Nginx у меня занимался SSL шифрованием и после проксированием к tornadio2
Спасибо за статью.
0
Прошли похожую эволюцию от чистого Pyramid к Pyramid + Tornado + TornadIO2 + Redis как общая шина. Потом отказались от socket.io в пользу sockjs и sockjs-tornado. Не могу указать конкретно, в чём корень проблем socket.io, но со стабильностью соединения и задержками стало гораздо лучше. К тому же sockjs не настолько node-центричен, протокол проще и прозрачнее.
Ещё я в процессе понял, как ненавижу программирование на коллбэках (асинхронный сервер у нас содержит приличный объём логики), но переписывать этот кусок на Erlang пока не велит bus factor, хотя прототип был сваян и опробован.
Ещё я в процессе понял, как ненавижу программирование на коллбэках (асинхронный сервер у нас содержит приличный объём логики), но переписывать этот кусок на Erlang пока не велит bus factor, хотя прототип был сваян и опробован.
+1
Спасибо за комментарий! Уже не первый человек говорит о недостатках socket.io — значит будем менять. Мне показалось у него какое-то странное поведение после несанкционированного разрыва соединения…
0
А зачем в торнадо писать на callback'ах если есть tornado.gen?
Единственное что надо не забывать вызывать callback, но я вот написал себе такой вот велосипед и он отлично работает: gist.github.com/3924669
#1 — где лежит исходник
#2 — как писать
#3 — аналог с текущим gen.engine
#4 — как можно писать в python 3.3+ (return в генераторе кидает StopIteration)
Реально используется в боевом приложении. Единственный минус — надо не забывать асинхронные вызовы оборачивать в gen.Task, а то иначе не происходит вызова.
Единственное что надо не забывать вызывать callback, но я вот написал себе такой вот велосипед и он отлично работает: gist.github.com/3924669
#1 — где лежит исходник
#2 — как писать
#3 — аналог с текущим gen.engine
#4 — как можно писать в python 3.3+ (return в генераторе кидает StopIteration)
Реально используется в боевом приложении. Единственный минус — надо не забывать асинхронные вызовы оборачивать в gen.Task, а то иначе не происходит вызова.
0
Писали мы конечно с tornado.gen и это отличная обёртка, но абстракция все равно течёт. Ладно, можно один раз проковырять исходники tornado и понять, как здесь реализовали кооперативную многозадачность на этот раз. Но больше всего напрягает, что синхронный и асинхронный код в Питоне — разные миры. Да, иногда можно забить на блокирующие операции сторонних библиотек. Можно вынести их в отдельный поток/процесс и общаться через очередь. Только после всего этого невольно возникает вопрос: а за тот ли молоток я вообще взялся?
0
Добавил вариант с sockjs.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
HowTo: Как подружить Django с WebSocket (socket.io, sockjs)