Веб-Приложение — Ну Почти Без Бэкенда: Flask, Redis, Api Через Jsonp, Jsfiddle.net

Эта статья является так называемым «доказательством концепции» создания фронтенд-приложения, работающего с API через JSONP, то есть, что называется, «кросс-оригин».

Также описана организация данных в Redis. Например, вы можете легко разместить его на jsfiddle.net какое-то приложение, серверная часть которого будет расположена в другом домене.

Согласитесь, что полноценный работающий конечный продукт (требующий какого-то сервера для централизации обмена данными), расположенный внутри JSFiddle, выглядит забавно!

Веб-приложение — ну почти без бэкенда: Flask, Redis, API через JSONP, JSFiddle.net

Цель статьи — поделиться своим текущим опытом с двух сторон:

  • Реализация JSONP + длинный опрос
  • Работаем с замечательным Redis
Ребята из BackendLess .



Что у нас есть

Итак, у нас есть:
  • Какой-то собственный сервер с 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: сообщения — это своего рода контейнер для сообщений от определенного пользователя, которые еще не получены.



Веб-приложение — ну почти без бэкенда: Flask, Redis, API через JSONP, JSFiddle.net



Длинный опрос

Используя 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

Вместе с данным постом часто просматривают: