Advertisement
Guest User

Untitled

a guest
Aug 19th, 2016
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.53 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. import tornado
  4. import tornadoredis
  5. from tornadio2 import SocketConnection
  6. from tornadio2.conn import event
  7. import django
  8. from django.utils.importlib import import_module
  9. from django.conf import settings
  10. from django.utils import simplejson
  11.  
  12. # start of kmike's sources
  13. _engine = import_module(settings.SESSION_ENGINE)
  14.  
  15.  
  16. def get_session(session_key):
  17.     return _engine.SessionStore(session_key)
  18.  
  19.  
  20. def get_user(session):
  21.     class Dummy(object):
  22.         pass
  23.  
  24.     django_request = Dummy()
  25.     django_request.session = session
  26.  
  27.     return django.contrib.auth.get_user(django_request)
  28. # end of kmike's sources
  29.  
  30.  
  31. # конфиг для подключения к redis можно хранить в настройках django
  32. ORDERS_REDIS_HOST = getattr(settings, 'ORDERS_REDIS_HOST', 'localhost')
  33. ORDERS_REDIS_PORT = getattr(settings, 'ORDERS_REDIS_PORT', 6379)
  34. ORDERS_REDIS_PASSWORD = getattr(settings, 'ORDERS_REDIS_PASSWORD', None)
  35. ORDERS_REDIS_DB = getattr(settings, 'ORDERS_REDIS_DB', None)
  36.  
  37. # немного удобства
  38. unjson = simplejson.loads
  39. json = simplejson.dumps
  40.  
  41.  
  42. class Connection(SocketConnection):
  43.     def __init__(self, *args, **kwargs):
  44.         super(Connection, self).__init__(*args, **kwargs)
  45.         self.listen_redis()
  46.  
  47.     @tornado.gen.engine
  48.     def listen_redis(self):
  49.         """
  50.        Вешаем подписчиков на каналы сообщений.
  51.        """
  52.         self.redis_client = tornadoredis.Client(
  53.                 host=ORDERS_REDIS_HOST,
  54.                 port=ORDERS_REDIS_PORT,
  55.                 password=ORDERS_REDIS_PASSWORD,
  56.                 selected_db=ORDERS_REDIS_DB
  57.             )
  58.         self.redis_client.connect()
  59.  
  60.         yield tornado.gen.Task(self.redis_client.subscribe, [
  61.             'order_lock',
  62.             'order_done'
  63.         ])
  64.         self.redis_client.listen(self.on_redis_queue)  # при получении сообщения
  65.                            #  вызываем self.on_redis_queue
  66.  
  67.     def on_open(self, info):
  68.         """
  69.        Определяем сессию django.
  70.        """
  71.         self.django_session = get_session(info.get_cookie('sessionid').value)
  72.  
  73.     @event  # событие, произошедшее в браузере
  74.     def login(self):
  75.         """
  76.        Определение пользователя и его возможностей
  77.        """
  78.         # это просто для примера входящей команды, определять юзера можно и в on_open
  79.         self.user = get_user(self.django_session)
  80.         self.is_client = self.user.has_perm('order.lock')
  81.         self.is_moder = self.user.has_perm('order.delete')
  82.  
  83.     def on_message(self):
  84.         """
  85.        Обязательный метод.
  86.        """
  87.         pass
  88.  
  89.     def on_redis_queue(self, message):
  90.         """
  91.        Обновление в списке заказов
  92.        """
  93.         if message.kind == 'message':  # сообщения у редиса бывают разного типа,
  94.                            # много сервисных, нам нужны только эти
  95.             message_body = unjson(message.body)  # разворачиваем сабж, как вы  
  96.                                    #  поняли я передаю данные в JSON
  97.  
  98.             # в зависимости от канала получения распределяем сообщения
  99.             if message.channel == 'order_lock':
  100.                 self.on_lock(message_body)
  101.  
  102.             if message.channel == 'order_done:
  103.                self.on_done(message_body)
  104.  
  105.    def on_lock(self, message):
  106.        """
  107.        Заказ закреплён
  108.        """
  109.        if message['user'] != self.user.pk:  # юзеру-источнику действия сообщать о нём не надо
  110.            self.emit('lock', message)
  111.  
  112.    def on_done(self, message):
  113.        """
  114.        Заказ выполнен
  115.        """
  116.        if message['user'] != self.user.pk:
  117.            if self.is_client:
  118.                message['action'] = 'hide'
  119.            else:
  120.                message['action'] = 'highlight'
  121.  
  122.            self.emit('done', message)
  123.  
  124.    def on_close(self):
  125.        """
  126.        При закрытии соединения отписываемся от сообщений
  127.        """
  128.        self.redis_client.unsubscribe([
  129.            'order_lock',
  130.            'order_done'
  131.        ])
  132.        self.redis_client.disconnect()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement