четверг, 14 апреля 2011 г.

asynchronous database tornado (async) django

В проектах онлайн общений, онлайн игр в движках этих проектов требуется асинхронное обращение к базе. Асинхронная работа увеличивает скорость работы проекта и не дает повиснуть или заткнуться движку.

Например, в tornadio или tornado при асинхронном общении с клиентом - требуется как раз такое подключение к базе.

Поискав в интернете - нашел приложение по обращению к базе данных database через http-протокол
dbslayer. Там - посылаешь sql-запрос через http - получаешь ответ в виде json. Неудобство - этот самый json и неочевидность - как же его поставить.

Для django и python программистов Я решил сделать подобное dbslayer django-async-dbslayer - там пишем orm-запрос, посылаем его и ждем уже удобный ответ в виде serialize queryset.

Пример использования django-async-dbslayer
Например, нам требуется получить всех пользователей в игре.
class SomeController(object):
def games_game_info(self):
UserInGame.dbslayer.filter(
game__id=self.game.pk
).select_related('game', 'user').async(callback=self._send_game_info)
def _send_game_info(self, response):
objects = deserialize(response.body)
count_users = len(objects)
game = objects[0].game
members = [{
'user_id': obj.user.pk,
'name': obj.name,
'position': obj.position,
'turn': obj.turn,
'on_community': obj.on_community,
'passed': obj.passed,
'current_bet': obj.current_bet,
'online': obj.user.pk in [
s.user.pk for s in self.s.gamers.get(self.game.pk, [])
]
} for obj in objects]
game_info = {
'_view': 'games_game_info',
'count_users': count_users,
'state': game.state,
'current_trump': game.current_trump,
'members': members
}
self._send_all(game_info)


_send_all - посылает ответ браузеру (socket.io)

django-async-dbslayer умеет использовать почти все методы queryset (кроме aggregate и annotate). Также есть возможность посылать запросы пачками

Мой знакомый развил тему и намного улучшил - сделал систему tornado-slacker

1 комментарий: