Chatter — основанный на python 2.7 websocket-framework с использованием tornado

    Хочу представить сообществу своё небольшое творение — Chatter.

    Chatter основан на python 2.7, использует tornado.

    Имеется готовое API для python (бэкэнд) и для js (фронтэнд)

    Примеры и исходный код на github.

    Для чего же собственно он был создан?





    Для быстрой и удобной разработки. Имеется собственный «протокол» — обёртка над json.

    Структура «app» файла:

    from chatter import BaseSocketHandler, run_application, Clients
    
    class Example1SocketHandler(BaseSocketHandler):
        #так называемый namespace проекта - один сервер может поддерживать несколько неймспейсов одновременно
        group = 'example1'
    
    def main():
        #Tornado-handler'ы
        run_application([
            (r'/example1', Example1SocketHandler),
        ])
    
    if __name__ == '__main__':
        main()
    


    Команды хранятся рядом с app файлов в папке api. Структура папки:

    • api/
      • example1/ наш проект-неймспейс
        • group/ группа методов
          • method1.py метод 1
          • method2.py метод 2


      • example2/ наш проект #2
        • group/ группа методов
          • method1.py метод 1
          • method2.py метод 2






    Больше ничего не нужно — при запуске сервиса папка api будет автоматически проанализирована на «методы», будет построена древовидная структура методов.

    Поддерживается динамическое обновление методов (пример в гите — chat).

    Файл метода (/api/example1/hello/world.py):

    class __api_result__(APIMethod):
            #параметры анализируются автоматически, порядок не имеет значение - главное "имя" параметра
    	def run(self, text1, text2, text3):
    		#возвращаем результат - tuple
    		#нулевой элемент - dict-параметров
    		#первый - success (результат выполнения - True / False)
    
    		return ({'text': [text1, text2, text3]}, True)
    


    А теперь html-js-часть:

    <!DOCTYPE html>
    <html>
    <head>
        <title>Chatter test</title>
        <meta charset="UTF-8">
        <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8"/>
        <!-- подключаем chatter.js -->
        <script src="js/vmchatter.js"></script> 
        <script src="http://code.jquery.com/jquery.js"></script>
    
        <script>
            //Описываем наш класс для работы с сервером. все конструкторы - типовые
            function Example1Chatter(host, port, params)
            {
                //создаем экземпляр chatter'а, на нужный хост, порт, указывая нужный "неймспейс"
                this.chatter = new VMChatter(host, port, 'example1', params, this);
            }
    
            //Добавляем метод, называя его hello
            Example1Chatter.prototype.hello = function(text2, text1, text3, callback)
            {
                //Сам проанализирует параметры, порядок также не имеет значение, главное, чтобы имена совпадали с серверной частью
                this.chatter.applyMethod('hello', 'world', arguments);
            };
        </script>
    
        <script type="text/javascript">
            var sx;
    
            $(document).ready(function()
            {
                //Создаем, подключаемся
                sx = new Example1Chatter('localhost', 8888, {
                    'onOpen': function(){
                        console.log('Connected');
                    },
                    'onClose': function(){
                        console.log('Disconnected');
                    }
                });
            });
    
            function sendHello()
            {
                sx.hello('text2', 'text1', 'text3', function(data, success)
                {
                    $('#results').append('<p>' + data.text + '</p>');
                });
            }
        </script>
    </head>
    <body>
                <button class="btn" onclick="sendHello();">Send hello</button>
                <div id="results"></div
    </body>
    


    Также поддерживается подписка на события (массовая рассылка подписавшимся, отправка определенному клиенту).

    На данный момент, к сожалению, документация отсутствует, но я в процессе её написания. Данный фреймворк используется в компании, где я работаю. Так что он «проверен» на нагрузки, часть багов выловлена и исправлена.

    Есть очень много возможностей, не представленных здесь и в примерах, готовятся еще несколько «плюшек».

    Остальные примеры и исходный код на github.
    • +17
    • 7,3k
    • 7
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 7
    • +4
      Начал уже писать PR, но понял, что слишком много вещей, сразу бросающийхся в глаза:
      1. .pyc-файлы в репозитории быть не должны (а тажке pyo и pyd). При создании на гитхабе питоньего репозитория предлагается пуленепробиваемый .gitignore, горячо рекомендую:
      .gitignore
      *.py[cod]
      
      # C extensions
      *.so
      
      # Packages
      *.egg
      *.egg-info
      dist
      build
      eggs
      parts
      bin
      var
      sdist
      develop-eggs
      .installed.cfg
      lib
      lib64
      
      # Installer logs
      pip-log.txt
      
      # Unit test / coverage reports
      .coverage
      .tox
      nosetests.xml
      
      # Translations
      *.mo
      
      # Mr Developer
      .mr.developer.cfg
      .project
      .pydevproject
      


      2. Код торнадо в репозитории — зачем он тут? Рекомендую ознакомиться с PyPI
      3. Следовательно, зачем в репозитории примеры. Их стоит вынести в отдельный репозиторий, а ваш код оформить в виде пакета (см setuptools, distutils).
      4. Почему именно py27? Ну, пускай, 2.6 — возможно, не подошел т.к. там нет приятных вещей из 2.7, но та же торнада отлично работает и с третьей веткой питона. Рекомендую ознакомиться и с ней тоже.
      • 0
        1. Спасибо, обязательно сделаю 1 пункт.
        2 + 3. На данный момент, сейчас, это больше демонстрационный пример репозитория, оформить пакетом собираюсь, когда всё доведу до ума и соберу фидбеки.
        4. Код вполне легко портируется на 3 версию, тоже планирую, просто писалось достаточно давно. На 2.6 тоже работает — проверял.
      • 0
        Единственное, что прикольно, это автоматический подхват новых модулей в апи (но с практчиеской точки зрения, функция сомнительна). С другой стороны, тот же SockJs приятнее на глаз
        • 0
          А можете рассказать, почему всё python сообщество не пересело на 3ю версию? Со стороны выглядит несолько странно.
          • 0
            Поломали обратную совместимость — нужно сильно напрягаться для переписывания библиотек. А зачем, если во втором уже всё работает, а особых причин для третьей нет?
            • 0
              Да и Django с Flask только недавно стали официально поддерживать 3-ю версию. При этом часть полезных батареек для Django до сих пор только для 2-ой версии питона.
              • 0
                Потому что все старые сервера в лучшем случае с python 2.6. Там уже много всего работает на питоне, обновлять и тестировать нет ни времени ни желания. Даже параллельно держать несколько питонов без тестирования опасно.

                А вот если там еще =< 2.5 так вобще печаль.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.