Это пример интеграции Redis (key/value хранилища данных в памяти) в веб-приложение на фреймворке Django. С помощью Django REST Framework создадим простой Web API. По GET запросу на URL будем получать значение ключа из Redis. Используя метод PUT и передавая новое значение ключа, будем обновлять значение ключа в Redis. С помощью метода DELETE будем удалять пару ключ/значение из Redis. Приступим!
Установка Redis на Linux
Устанавливаем сервер Redis на Linux-сервере (ОС Debian):
apt install redis-server
Проверяем установку Redis, для этого заходим в интерфейс командной строки Redis с помощью команды:
redis-cli
и посылаем команду ping:

Если сервер Redis успешно установлен и готов к работе, будет возвращен ответ PONG.
Устанавливаем библиотеку redis-py, необходимую для взаимодействия нашего приложения с сервером Redis:
pip3 install redis
Установка фреймворков Django и DRF
Устанавливаем фреймворки Django и DRF (Django REST Framework) на Linux-сервер (ОС Debian):
pip3 install django djangorestframework
Создание проекта Django
В текущем каталоге создаем каталог proj2 для нашего проекта:
django-admin startproject proj2
cd proj2/
Структура созданного каталога proj2 следующая:

Создаем наше веб-приложение app2 командой:
python3 manage.py startapp app2
Структура каталога proj2 стала следующей:

Запуск веб-сервера разработки Django
Запускаем веб-сервер разработки Django, который будет обслуживать наше веб-приложение. Мне нужен доступ к веб-серверу разработки Django с другого компьютера сети, поэтому запускаю веб-сервер разработки Django с указанием его IP адреса в сети (192.168.1.38) и порта (8000):
python3 manage.py runserver 192.168.1.38:8000
Добавляем IP-адрес 192.168.1.38 в список разрешенных хостов, для этого правим файл конфигурации proj2/proj2/settings.py:
ALLOWED_HOSTS = ['192.168.1.38']
При сохранении файла конфигурации proj2/proj2/settings.py веб-сервер разработки Django сам автоматически перезагрузится.
К слову, веб-сервер разработки Django автоматически перезагружается при внесении изменений в код существующих в проекте файлов Python. А при добавлении новых файлов Python в проект потребуется ручная перезагрузка веб-сервера разработки.
Для проверки соединения с веб-сервером набираем в адресной строке браузера:
http://192.168.1.38:8000/
В случае успеха браузер отобразит страницу:

Настройка проекта Django
По умолчанию в файле конфигурации proj2/proj2/settings.py подключено к нашему проекту proj2 некоторое количество базовых приложений, поставляемых с Django, таких, как аутентификация, сессии, сообщения и т.д. Создаем для этих приложений необходимые таблицы в базе данных:
python3 manage.py migrate
Добавляем наше веб-приложение app2 и Django REST Framework в наш проект proj2, для этого в файле конфигурации proj2/proj2/settings.py в параметре INSTALLED_APPS добавим строчки:
'app2',
'rest_framework',

Настройка соединения с Redis
Добавляем параметры доступа к серверу Redis, для этого в файле конфигурации proj2/proj2/settings.py добавим строки:
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
Соединяемся с сервером Redis, для этого в файле proj2/app2/views.py добавляем строки:
from django.conf import settings
import redis
redis_storage = redis.StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=0)
Настройка URL
Добавляем URL, по которому будет доступно ваше веб-приложение, наш Web API, для этого файл proj2/proj2/urls.py приводим к виду:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('app2/', include('app2.urls')),
]
Создаем файл proj2/app2/urls.py и добавляем в него следующие строки:
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from .views import manage
urlpatterns = {
path('<slug:key>', manage, name='manage')
}
urlpatterns = format_suffix_patterns(urlpatterns)
Теперь все запросы, поступающие на URL http://192.168.1.38:8000/app2/<key>, будет обрабатывать наше приложением app2, а, точнее, функция manage(), которая будет описана в файле proj2/app2/views.py. Кроме обработки запросов, функция manage() будет взаимодействовать с Redis.
Настройка представления
Добавим в файл proj2/app2/views.py строки импорта необходимых библиотек:
from rest_framework.decorators import api_view
from rest_framework import status
from rest_framework.response import Response
import json
Опишем представление manage(), для этого в файл proj2/app2/views.py добавим строки:
@api_view(['GET', 'PUT', 'DELETE'])
def manage(request, *args, **kwargs):
if request.method == 'GET':
if kwargs['key']:
value = redis_storage.get(kwargs['key'])
if value:
response = {
'key': kwargs['key'],
'value': value,
'msg': 'Success'
}
return Response(response, status=200)
else:
response = {
'key': kwargs['key'],
'value': None,
'msg': 'Not found'
}
return Response(response, status=404)
elif request.method == 'PUT':
if kwargs['key']:
request_data = json.loads(request.body.decode('utf-8'))
new_value = request_data['new_value']
value = redis_storage.get(kwargs['key'])
if value:
redis_storage.set(kwargs['key'], new_value)
response = {
'key': kwargs['key'],
'value': new_value,
'msg': 'Successfully updated'
}
return Response(response, status=200)
else:
response = {
'key': kwargs['key'],
'value': None,
'msg': 'Not found'
}
return Response(response, status=404)
elif request.method == 'DELETE':
if kwargs['key']:
result = redis_storage.delete(kwargs['key'])
if result == 1:
response = {
'msg': 'Successfully deleted'
}
return Response(response, status=404)
else:
response = {
'key': kwargs['key'],
'value': None,
'msg': 'Not found'
}
return Response(response, status=404)
В случае запроса на URL http://192.168.1.38:8000/app2/<key> методом GET, функция manage() ищет в Redis по ключу <key> его значение. Если ключ найден, то формируется ответ формата JSON с ключом, его значением, сообщением ‘Success’. Ответ отправляется запросившему с кодом состояния HTTP 200. Если ключ в хранилище не найден, то формируется ответ формата JSON с ключом и сообщением ‘Not found’, ответ отправляемся запросившему с кодом состояния HTTP 404.
В случае запроса на URL http://192.168.1.38:8000/app2/<key> методом PUT, новое значение ключа передается в формате JSON. Функция manage() вычленяет из содержимого запроса новое значение для ключа <key> и ищет в Redis по ключу <key>. Если ключ найден, значение ключа в хранилище обновляется, а запросившему отправляется ответ с сообщением об успешном обновлении. В случае отсутствия ключа в хранилище, запросившему отправляется ответ с сообщением об отсутствии ключа в хранилище.
Если отправить запрос на URL http://192.168.1.38:8000/app2/<key> методом DELETE, функция manage() попытается удалить ключ <key> и его значение из Redis. В случае успешного удаления, запросившему отправляется JSON-ответ с сообщением об успешном удалении. При неудаче в удалении ключа и его значения, запросившему отправляется JSON-ответ с сообщением, что ключ <key> в хранилище не найден.
Проверка работоспособности
Первым делом добавим в хранилище Redis пару ключ/значение: ключ KEY1 и значение VALUE1:
redis-cli
SET KEY1 VALUE1

Тестировать Web API, т.е. отправлять запросы на URL Web API разными HTTP методами, удобнее всего в бесплатной программе Postman.
Отправляем GET запрос на URL нашего Web API для ключа KEY1, чтобы получить значение ключа. URL получается следующий:
http://192.168.1.38:8000/app2/KEY1

Получили для ключа KEY1 верное значение VALUE1. Ура!
Чтобы изменить значение ключа на новое значение VALUE2, отправляем PUT запрос на тот же URL со следующим JSON:
{
"new_value": "VALUE2"
}

Нам возвращен JSON-ответ, что обновление значения ключа успешно произведено. Давайте проверим, отправив GET запрос на тот же URL:

Ура! Теперь у ключа KEY1 значение VALUE2.
Чтобы удалить пару KEY1/VALUE2, отправляем DELETE запрос на все тот же URL:

Нам возвращен JSON-ответ, что удаление пары ключ/значение успешно произведено. Давайте проверим, отправив GET запрос на тот же URL:

Возвращается ответ, что ключ KEY1 не найден.
Выводы
С помощью Django REST Framework создали Web API. Настроили представление для трех HTTP методов: GET, PUT, DELETE. Изучили, как работать с Redis (key/value хранилищем данных в памяти). Узнали, как с сервером Redis настроить соединение, как произвести поиск по ключу, как обновить значение ключа и как удалить пару ключ/значение.
Как это может помочь бизнесу?
Если в бизнесе есть собственное веб-приложение, то использование Redis в роли кэша помогает улучшить производительность приложения. Скорость доступа к данным в таком кэше — это скорость доступа к данным в памяти. В такой кэш помещаются данные, которые редко меняются, но к которым часто обращается приложение, либо данные, которые часто меняются, но которые не относятся к критически важным. Кроме того, использование кэша снижает нагрузку на центральную базу данных приложения, вроде MySQL или PostgreSQL.
Ну, а данная статья рассказала, как легко «прикрутить» Redis к веб-приложению.
Все вопросы оставляйте под статьей в комментариях. Удачи в бизнесе!
Комментарии