Това е пример за интеграция на 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 команден интерфейс

Ако сървърът 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 са включени няколко базови приложения, предоставени от 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.

Получихме правилната стойност за ключа KEY1VALUE1. Ура!

За да промените стойността на ключа с новата стойност VALUE2, изпращаме PUT заявка към същия URL със следния JSON:

{
"new_value": "VALUE2"
}
PUT заявка към URL на Web API.

Получихме JSON отговор, че актуализирането на ключовата стойност е успешно. Нека да проверим, като изпратим заявка GET на същия URL:

Стойността на ключа в Redis е актуализирана.

Ура! Сега ключът KEY1 има стойност VALUE2.

За да изтрием двойката KEY1/VALUE2, изпращаме заявка DELETE на същия URL:

Заявка за изтриване на 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 Политика конфиденциальности и Условия использования.

Sign In

Register

Reset Password

Please enter your username or email address, you will receive a link to create a new password via email.