Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
15 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 24

Организация кода в Tornado. WebSocket

16.02.2016, 21:02. Показов 1288. Ответов 0

Студворк — интернет-сервис помощи студентам
Добрый день.

Работаю на python 3.4

Осваиваю вебсокеты в tornado.

У меня есть такой код (месенджер):

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import redis
import momoko
 
...
 
# БД для быстрой проверки вхождений
c = redis.StrictRedis()
 
# Пулл подключенных по вебсокету пользователей
client_dict = {}
 
...
 
class MessagesHandler(tornado.websocket.WebSocketHandler):
    def __init__(self, *args, **kwargs):
        super(MessagesHandler, self).__init__(*args, **kwargs)
 
    @property
    def db(self):
        return self.application.db
 
    def check_origin(self, origin):
        return True
 
    def open(self):
        # Получаю сессию из кук, получаю инфу о юзере, 
        # Создаю черный список и список диалогов в redis 
        # для дальнейшей быстрой проверки по вебсокету при отправке сообщений 
        
    @tornado.gen.coroutine
    def on_message(self, mess):
        # Все сообщения идут в json виде.
        # Валидация jsonschema
    
        if 'message' in received_json_data:
            # Беру инфу из json
            # Собщение может быть текстом, фотографией, локацией и еще несколько варинтов
 
            try:
                # Проверка, что юзер которому хотим отпраить сообщение онлайн по вебсокету
                if len(client_dict[recipient_id]) == 0:
                    self.write_message(to_json_error('Empty clients list. Write to administrator', ticket))
                    return
            except KeyError:
                # Recipient is OFFLINE
                # Сообщение записывается в Postgres после нескольких проверок 
                # (блеклист, соответствие диалогу и т.д.)
                response = yield self.send_to_DB_and_check(..., check=True)
                # ...
                return
 
            # Recipient is ONLINE
            # Проверка в redis (блеклист, соответствие диалогу и т.д.)
 
            # RDB
            # Запись сообщения в Postgres. Просто INSERT, так как провеки все сделаны
            response = yield self.send_to_DB_and_check(..., check=False)
            
            # Отсылка сообщения получателю по вебсокету
            for k, recipient_wsconnection in client_dict[recipient_id].items():
                recipient_wsconnection.write_message(...)
                
            # Отсылка сообщения что все ок отправителю
            self.write_message(...)
            
        # Другой тип сообщения для сигнализации что пользователь начал ввод сообщений
        elif 'typing' in received_json_data:
            # Тут проверок нет практически  
            # Но код занимает строчек 30
 
        # Сообщение для тестирование (эмуляция присылания сообщений от рандомных юзеров)            
        elif 'test' in received_json_data:
            # Тут где-то 170 строк кода
            
            # В сообщении присылается кол-во сообщений, кторое юзер хочет получить
            # Генерация требуемого кол-ва юзеров естественно с проверками на блокировку и т.д.
                # Проверка сущестует ли диалог, если нет то создается
            # Отправка сообщений юзерам с записью в БД
 
    # Проверка в Postgres  
    @tornado.gen.coroutine
    def send_to_DB_and_check(self, thread_id, sender_id, recipient_id, message, time, type_mes, check=False):
        if check == True:
            # Несколько SQL запросов
        else:
            # Один SQL запрос
        return True, data
        
    def on_close(self):
        # Для экономии места удаляем инфу из redis для отключающегося юзера
 
...
Все работает хорошо. Но все вот эти
Python
1
if 'message' ...
,
Python
1
if 'typing' ...
,
Python
1
if 'test' ...
знимают кучу места. Не очень читабельно. Хочется сгрупировать их во что-то типа функций, как я сделал с функцией "send_to_DB_and_check"... Но как-то это все сложно может есть способ лаконичнее? Раскидывать по хендлерам? Сигналы?

Как бы мне сделать код более компактнее и читабельнее?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.02.2016, 21:02
Ответы с готовыми решениями:

Tornado WebSocket ошибка
Добрый день. У меня есть простейший сервер на Tornado: import tornado.ioloop import tornado.web import tornado.websocket ...

Websocket, мне нужно получать данные по websocket круглосуточно
Здравствуйте, составляю тз, возник вопрос по websocket, мне нужно получать данные по websocket круглосуточно: 1) Лучше делать одно...

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2016, 21:02
Помогаю со студенческими работами здесь

Организация кода
Пишу апи веб-сервер на основе FastApi, и столкнулся с проблемой "засорения" кода. С питоном особо не знаком, но кажется что проблема...

Организация кода
Здравствуйте. Подскажите пожалуйста что почитать по организации кода и ООП, желательно конкретно про JS, ну или про ООП в общем. Только...

Организация кода
Задача такая: Открывается окно, где требуется ввести путь до БД. Вводишь правильный путь, затем проверяется есть ли определённые таблицы в...

Организация кода по категориям
Всем привет :senor:

Правильная организация кода
Здравствуйте! У меня возник вопрос по поводу правильного написания программы. Сейчас, я пишу небольшое консольное приложения для работы с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru