Эта статья является так называемым «доказательством концепции» создания фронтенд-приложения, работающего с API через JSONP, то есть, что называется, «кросс-оригин».
Также описана организация данных в Redis. Например, вы можете легко разместить его на jsfiddle.net какое-то приложение, серверная часть которого будет расположена в другом домене.
Согласитесь, что полноценный работающий конечный продукт (требующий какого-то сервера для централизации обмена данными), расположенный внутри JSFiddle, выглядит забавно!
Цель статьи — поделиться своим текущим опытом с двух сторон:
- Реализация JSONP + длинный опрос
- Работаем с замечательным Redis
Что у нас есть
Итак, у нас есть:- Какой-то собственный сервер с Python 2.x на борту
- Браузер и доступ JSFiddle.net
- Желание построить API поверх JSONP.
Что я использовал
JSONP
Думаю, читателю не нужны пояснения, что это такое.Что касается реализации, то всё делает один декоратор:
def jsonp(fn): def wrapper(*args, **kwargs): callback = request.args.get('callback', None) if not callback: raise BadRequest('Missing callback argument.') return '{callback}({data});'.
format( callback=callback, data=dumps(fn(*args, **kwargs)) ) wrapper.__name__ = fn.__name__ return wrapper
Редис
Есть такая замечательная вещь — Redis. Как говорят об этом разработчики,Redis — это расширенный кэш и хранилище с открытым исходным кодом, лицензированный BSD. Его часто называют сервером структуры данных, поскольку ключи могут содержать строки, хеши, списки, наборы, отсортированные наборы, растровые изображения и гиперлоги.Или в двух словах:
Redis — это мощная система хранения и кэширования данных «ключ-значение».
Немного о Редисе
Если вы не знакомы с Redis, советую прочитать о нем на оф.сайт, так как ниже будут описаны не все тонкости работы с ним.
Собственно, сам Redis работает как отдельный демон, и из Python-скрипта мы обращаемся к нему через довольно простой одноимённый модуль-коннектор.
Мы можем создать ключ и назначить его:
- Скалярное значение (фактически - линия )
- Список
- Множество
- Куча
- Сортированный набор
Поэтому в этом случае вам придется сделать ключ со списком индексов и ключом для каждого индекса.
Также из-за отсутствия выборки по значениям (а-ля WHERE в SQL) иногда приходится составлять списки с обратным «отображением», например, для поиска идентификатора пользователя по нику и для поиска ника пользователя по его идентификатору.
Грубо говоря: Какая таблица в SQL будет в Redis индексный список И набор массивов .
Части ключа также принято разделять двоеточием.
Пример в SQL: 1 таблица - с полями user_id, user_name, user_email и 5 записями.
Аналогия в Redis: 1 список и 5 массивов — список пользователи с данными [1, 2, 3, 4, 5] и 5 массивами с именами (ключами) вида пользователь: X с данными {id:X, name:Y, email:Z}, а также несколько массивов с обратной ссылкой, например, ники со значениями {andrew:1, john:2, mike:3,.
}
Почему Редис?
- В Redis вам не нужно определять структуры данных: вам просто нужно их туда поместить.
- Мы можем CRUD ( Создать-Чтить-Обновить-Удалить ) с данными, расположенными в базе данных Redis, а также использовать встроенный механизм блокировки — это, кстати, значительно упрощает реализацию механизма длинный опрос .
- Redis не может делать никаких JOIN или WHERE, да и не должен — он просто хранит примитивы, максимум списки или ассоциативные массивы примитивов.
Но это не минус, а дополнительная свобода действий и стимул к расширению мышления, отличающийся от шаблонов SQL и NoSQL СУБД.
Структура базы данных системы хранения «ключ-значение»
Вот как выглядят данные в нашем Redis в тот момент, когда Андрей написал сообщение, а Джон написал сообщение, но первое прочитали все, кроме Майка, а второе прочитал только сам Джон.Но через несколько мгновений все пользователь: X: сообщения будет очищено, т.к.
произойдет таймаут опроса и данные пойдут клиентам.
Те.
пользователь: X: сообщения — это своего рода контейнер для сообщений от определенного пользователя, которые еще не получены.
Длинный опрос
Используя Redis, вы можете легко реализовать длинный опрос .Примерный алгоритм:
- Запрашиваем в Redis (командой ЛЛЕН ), есть ли сейчас какие-нибудь сообщения в списке сообщений для клиента? Если да, мы возвращаем сообщения и очищаем список через ДЕЛ
- Если сообщений нет, запрашиваем их еще раз, но на этот раз командой БЛПОП , который будет блокировать активный поток до тех пор, пока не появятся данные или не истечет время ожидания.
После разблокировки мы возвращаем клиенту результат от Redis, который будет содержать либо только что пришедшее сообщение, либо ничего.
«Боевая команда, вперед!»
Интерфейс для тестирования: jsfiddle.net/andunai/kcdtzdww Исходный код серверной части: bitbucket.org/AndrewDunai/nobackend-chat-dirty Полноэкранная версия: jsfiddle.net/andunai/kcdtzdww/embedded/resultПост скриптум
Мне очень приятно, что вы дочитали до этого места.Как всегда буду рад любым комментариям и пожеланиям.
Надеюсь хабраэффект не слишком сильно повлияет на мой небольшой VPS. Спасибо за внимание! ОБНОВЛЕНИЕ: репозиторий теперь общедоступен, я случайно сделал его приватным при его создании.
Теги: #python #JavaScript #backendless #jsfiddle #Безумное программирование #Веб-разработка #python #flask
-
Великолепный Дизайн Приключенческих Игр
19 Oct, 24 -
Через Тернии – На Мкс
19 Oct, 24 -
Zone.su Подешевел В 5 Раз!
19 Oct, 24 -
Впечатления От Создания Сайта На Heroku.com
19 Oct, 24 -
Мозгштормкафе
19 Oct, 24 -
Принимать Участие
19 Oct, 24 -
Asn1Js И Pkijs — Год После Создания
19 Oct, 24