Пользователь
0,0
рейтинг
21 июня 2013 в 08:49

Разработка → 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.
Denis Vidog @Vidog
карма
29,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (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 так вобще печаль.

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