import asyncio  # модуль, который позволяет работать в асинхронном режиме
import random
# "сообщаем", что функция получения данных будет исполняться как сопрограмма
@asyncio.coroutine
def fetch_data():
    data = 0
    # Для примера, будем запрашивать данные, пока не выпадет 6-ка.
    # в реале, вместо получения рандома, ты должен делать запрос к БД
    while not data == 6: 
        print(data)
        data = random.randint(0, 10)  # вот тут делай запрос к БД и заполняй твою переменную
        yield from asyncio.sleep(3.0)  # асинхронная задержка, она не будет блокировать приложение
    return data  # когда вышли из цикла, в переменной data будет только нужная инфа
# эта функция тоже будет исполняться как сопрограмма. без этого декоратора невозможно получать асинхронно данные через yield from
@asyncio.coroutine
def test():
    # получаем данные асинхронно
    # переменная data заполнится только тогда, когда в функции fetch_data выпадет 6,
    # она выйдет из цикла и вернёт значение
    data = yield from fetch_data()
    print('Bingo!', data)
    loop.stop()  # когда получили данные, останавливаем асинхронный цикл
    # ты не должен останавливать, чтобы каждый раз не запускать цикл при получении данных
    # ты должен просто вернуть данные клиенту    
    
if __name__ == '__main__':
    loop = asyncio.get_event_loop()  # создаём цикл
    asyncio.async(test())  # асинхронно запускаем функцию
    # тебе это надо делать при каждом запросе на какой-то УРЛ
    # По-сути, в обработчике УРЛ ты должен просто вызывать функцию test, 
    # а она уже отошлёт данные клиенту
    loop.run_forever()  # запускаем бесконечный асинхронный цикл
    loop.close()  
    # если он завершится (у меня он завершается, когда получена 6-ка), надо закрыть цикл@app.route("/api/items/")
def items():
    shift = request.get("shift")
    count = request.get("count")
    return Item.objects.all().from(shift).to(shift + count)var bytesToSend = [253, 0, 128, 1],
    bytesToSendCount = bytesToSend.length;
var bytesArray = new Uint8Array(bytesToSendCount);
for (var i = 0, l = bytesToSendCount; i < l; i++) {
  bytesArray[i] = bytesToSend[i];
}
$.ajax({
   url: '%your_service_url%',
   type: 'POST',
   contentType: 'application/octet-stream',  
   data: bytesArray,
   processData: false
});<script type="text/javascript">
    function PopupModel(data) {
        var self = this;
        ko.mapping.fromJS(data, {}, self);
    }
    function ViewModel(data) {
        var self = this;
        var activePopup = ko.observable(null);
        ko.mapping.fromJS(data, {}, self);
        var popUpChooser = function(popupId) {
            $.getJSON('/api/popup/' + popupId, function(data) {
                // Получаем инфу для одного попапа
                // JSON:
                // {
                //     'id': '1',
                //     'name': 'foo',
                //     'email': 'foo@example.com'
                // }
                self.activePopup(new PopupModel(data));
            })            
        }
    }
    $(function() {
        $.getJSON('/api/popup/ids/', function(data) { // получаем список Id инфы для попапов
            // JSON такого вида: { popupIds: ['1', '2', '3'] }
            ko.applyBindings(new ViewModel(data));
        });
    });
</script>
<div data-bind="foreach: popupsIds">
    <input type="radio" data-bind="attr: {value: $data}"/>
</div>
<div class="popup" data-bind="if: activePopUp"> // отображаем, только если есть активный попап
    <div data-bind="text: activePopup().name"></div>
    <div data-bind="text: activePopup().email"></div>
</div>class Effect:
    def __init__(self, name, mods):
        self.name = name
        self.mods = mods
        # mods - это словарь с модификаторами
        # ключ - имя поля в классе User
        # значение - функция, которая принимает экземпляр класса User и промежуточное значение поля
        # а возвращает изменённое значение поля
class User:
    def __init__(self, name, strength, agility):
        # Инициируем начальные значения
        self.name = name
        self.strength = strength
        self.health = strength * 100
        self.agility = agility
        self.effects = list()
    # в самом классе храним только независимые значения
    # но любой доступ к параметрам должен идти через геттер
    # для каждого необходимого параметра создаём функцию-геттер
    # которая будет учитывать применение эффектов
    # можно вместо этого использовать @property
    def get_strength(self):
        strength = self.strength
        for effect in self.effects:
            if effect.mods.get('strength'):
                strength = effect.mods['strength'](strength, self)  # вызываем функцию - модификатор
        return strength
    def get_agility(self):
        agility = self.agility
        for effect in self.effects:
            if effect.mods.get('agility'):
                agility = effect.mods['agility'](agility, self)  # вызываем функцию - модификатор
        return agility
    def get_health(self):
        health = self.health
        for effect in self.effects:
            if effect.mods.get('health'):
                health = effect.mods['health'](health, self)  # вызываем функцию - модификатор
        return health
    # Это зависимый параметр
    def get_max_health(self):
        max_health = self.get_strength() * 100  # первоначальное значение вычисляется на основе силы
        for effect in self.effects:
            if effect.mods.get('max_health'):
                max_health = effect.mods['max_health'](max_health, self)  # вызываем функцию - модификатор
        return max_health
if __name__ == '__main__':
    foo = User('Foo', 10, 10)
    god_strength = Effect('God strength', {
        'strength': lambda s, u: s + 10
    })
    def _life_power_func(value, user):
        return value + 100
    life_power = Effect('Life Power', {
        'max_health': _life_power_func
    })
    def _extra_agility_func(value, user):
        return value + 10
    # этот эффект влияет сразу на 2 параметра
    extra_agility = Effect('Extra agility', {
        'agility': _extra_agility_func,
        'max_health': lambda h, u: h - 400
    })
    print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
    foo.effects.append(god_strength)
    print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
    foo.effects.append(life_power)
    print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])
    foo.effects.append(extra_agility)
    print(foo.get_strength(), foo.get_max_health(), foo.get_health(), foo.get_agility(), [e.name for e in foo.effects])10 1000 1000 10 []
20 2000 1000 10 ['God strength']
20 2100 1000 10 ['God strength', 'Life Power']
20 1700 1000 20 ['God strength', 'Life Power', 'Extra agility']      Но в объектно-ориентированном программировании используется активная модель MVC, где модель — это не только совокупность кода доступа к данным и СУБД, но и вся бизнес-логика. Следует отметить возможность модели инкапсулировать в себе другие модели. В свою очередь, контроллеры представляют собой лишь элементы системы, в чьи непосредственные обязанности входит приём данных из запроса и передача их другим элементам системы. Только в этом случае контроллер становится «тонким» и выполняет исключительно функцию связующего звена (glue layer) между отдельными компонентами системы.
class User(object):
    clients = set()  # можно использовать и список
                     # можно и словарь, чтобы быстро получать 
                     # конкретного пользователя по какому-то ключу
    def __init__(self, user=None, root=None, admin=None, moderator=None, **kwargs):
        self.user = user
        self.root = root
        self.admin = admin
        self.moderator = moderator
        # Записываем в класс необходимые поля из kwargs
        self.foo = kwargs.pop('foo', 'default_value')
    def auth(self):
        # тут аутентифицируем юзера
        # данные, которые пришли в ответ, можно записать в поля класса
        # после того, как всё записал, делай так:
        self.clients.add(self)  # добавляем подключившегося пользователя
        # Этот массив/сет/словарь будет доступен из любого экземпляра этого класса
        # и из самого класса тоже, например: [print(client) for client in User.clients]
# чтобы хранить данные между перезагрузкой сервера, можно использовать pickle:
import pickle
with open('foo.pickle', 'w') as f:
    pickle.dump(f, User.clients)
# загружать так же:
with open('foo.pickle'. 'r') as f:
    User.clients = pickle.load(f)>>> class A(object):
...     c = list()
...     def __init__(self, **kwargs):
...         self.__dict__.update(**kwargs)
...     def save(self):
...         self.c.append(self)
... 
>>> a = A(a=1, b=2)
>>> a.save()
>>> b = A(a=[3, 4], foo={1, 2})
>>> b.save()
>>> A.c
[<__main__.A object at 0x7fd63603d0b8>, <__main__.A object at 0x7fd63603dc18>]
>>> pickle.dumps(A.c)
b'\x80\x03]q\x00(c__main__\nA\nq\x01)\x81q\x02}q\x03(X\x01\x00\x00\x00bq\x04K\x02X\x01\x00\x00\x00aq\x05K\x01ubh\x01)\x81q\x06}q\x07(X\x03\x00\x00\x00fooq\x08cbuiltins\nset\nq\t]q\n(K\x01K\x02e\x85q\x0bRq\x0ch\x05]q\r(K\x03K\x04eube.'
>>> A.c = []
>>> A.c = pickle.loads(b'\x80\x03]q\x00(c__main__\nA\nq\x01)\x81q\x02}q\x03(X\x01\x00\x00\x00bq\x04K\x02X\x01\x00\x00\x00aq\x05K\x01ubh\x01)\x81q\x06}q\x07(X\x03\x00\x00\x00fooq\x08cbuiltins\nset\nq\t]q\n(K\x01K\x02e\x85q\x0bRq\x0ch\x05]q\r(K\x03K\x04eube.')
>>> A.c
[<__main__.A object at 0x7fd63604ca58>, <__main__.A object at 0x7fd63604c908>]
>>> A.c[0].a
1
>>> A.c[1].a
[3, 4]