Това е пример за интеграция на Redis (key/value хранилище на данни в паметта) в уеб приложение на Django фреймуърк. Ще създадем прост Web API с помощта на Django REST Framework. Чрез 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 са включени няколко базови приложения, предоставени от 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 към уеб приложение.
Оставете всички въпроси под статията в коментарите. Успех в бизнеса!
Коментари