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]