Это пример интеграции 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

Если сервер 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 следующая:

Структура каталога Django-проекта

Создаем наше веб-приложение app2 командой:

python3 manage.py startapp app2

Структура каталога proj2 стала следующей:

Структура каталога Django-проекта с приложением

Запуск веб-сервера разработки 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

Настройка проекта 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',
Подключение к проекту приложения и Django 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
Добавили в Redis пару ключ-значение

Тестировать Web API, т.е. отправлять запросы на URL Web API разными HTTP методами, удобнее всего в бесплатной программе Postman.

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

http://192.168.1.38:8000/app2/KEY1
GET запрос на URL Web API

Получили для ключа KEY1 верное значение VALUE1. Ура!

Чтобы изменить значение ключа на новое значение VALUE2, отправляем PUT запрос на тот же URL со следующим JSON:

{
"new_value": "VALUE2"
}
PUT запрос на URL Web API

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

Обновилось значение ключа в Redis

Ура! Теперь у ключа KEY1 значение VALUE2.

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

DELETE запрос на URL Web API

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

Ключ не найден в Redis

Возвращается ответ, что ключ KEY1 не найден.

Выводы

С помощью Django REST Framework создали Web API. Настроили представление для трех HTTP методов: GET, PUT, DELETE. Изучили, как работать с Redis (key/value хранилищем данных в памяти). Узнали, как с сервером Redis настроить соединение, как произвести поиск по ключу, как обновить значение ключа и как удалить пару ключ/значение.

Как это может помочь бизнесу?

Если в бизнесе есть собственное веб-приложение, то использование Redis в роли кэша помогает улучшить производительность приложения. Скорость доступа к данным в таком кэше — это скорость доступа к данным в памяти. В такой кэш помещаются данные, которые редко меняются, но к которым часто обращается приложение, либо данные, которые часто меняются, но которые не относятся к критически важным. Кроме того, использование кэша снижает нагрузку на центральную базу данных приложения, вроде MySQL или PostgreSQL.

Ну, а данная статья рассказала, как легко «прикрутить» Redis к веб-приложению.

Все вопросы оставляйте под статьей в комментариях. Удачи в бизнесе!

Комментарии

Добавить комментарий

Этот сайт защищен reCAPTCHA, и к нему применяются Google Политика конфиденциальности и Условия использования.

Войти

Зарегистрироваться

Сбросить пароль

Пожалуйста, введите ваше имя пользователя или эл. адрес, вы получите письмо со ссылкой для сброса пароля.