Рубрики
Без рубрики

Создание URL-записи API В Джанго – Редис

Мы построим простой сокращение URL-адрес с помощью Django и Redis, данные будут храниться в SQLite и Redis … Теги с Python, Django, Redis, WebDev.

Мы построим простой сокращение URL-адреса с помощью Django и Redis, данные будут храниться в SQLite, и Redis будет использоваться в качестве хранилища кэша.

Настройка виртуальной среды для этого проекта

Настройте виртуальную среду для этого проекта, поэтому она не повлияет на проекты в вашей машине.

Установка зависимости для проекта

pip install django
pip install redis

Вышеуказанная команда установит последнюю версию пакетов

Настройка проекта Django

Подробную ссылку о Джанго Посетите страницу Теперь мы можем создать наш проект

django-admin startproject urlshortener
cd urlshortener

Чтобы успешно проверить приложение, запустите это, он откроет страницу ракеты (в терминале, которую вы можете увидеть ненастированную миграцию, мы увидим это в миграции)

python manage.py runserver

Приведенная ниже команда создаст приложение Call короткая (где логика будет написана) внутри urlshortener.

python manage.py startapp short

Теперь мы должны добавить приложение для коротких настроек .py, это поможет Django определить изменения в моделях

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'short',
]
Что такое модель Django?
You can think model as a table in django, in SQL we use tables to store the data, right, In the same way model is being used. Table schema can be created in model then it can be migrated to the database.

По умолчанию Django поставляется с SQLite DB, вы можете изменить его на любой источник данных, который вы хотите подключиться

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
моделей

Теперь добавьте этот код в короткие/модели .py

from django.db import models

class URL(models.Model):
    full_url = models.TextField()
    hash = models.TextField(unique=True)

    class Meta:
        db_table = 'url_shortener'

В Full_url мы удержим данный URL в хэш-магазине будет хранить уникальный ключ db_table, удерживает имя таблицы

Пробежать это

python manage.py makemigrations short

Запустив Makemigrations, вы говорите Django, что вы внесли некоторые изменения в ваши модели, приведенная выше команда ищет изменения в коротком приложении, для загрузки изменений со всех моделей приложений, просто запустившихся

 python manage.py makemigrations

Это создаст файлы миграции внутри каталога истории/миграции, после чего перемещать изменения в SQLite DB, запустите это

python manage.py migrate

Когда вы запускаете эту команду, это применит администратор, миграцию, связанную с сеансом в базу данных, все предупреждения в терминале будут уходить

Вид и URL-адреса

Где мы напишем логику

Создайте URLS.PY Внутри короткого каталога, после этого включите файл в URLShortener/URLS.PY, так же, как это

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include("short.urls")),
]

Теперь давайте напишем простой вид httpresponse, называемый дома, в коротком/просмотр.

from django.http import HttpResponse

def home(request):
    current_site = get_current_site(request)
    return HttpResponse("

Url Shortener

")

Затем свяжите вид с URL

from django.urls import path
from short import views

urlpatterns = [
    path('', views.home, name="Home"),
]

Откройте домашний URL ( http://127.0.0.1:8000/ ) Вы получите httpresponse

Проект работает нормально, теперь давайте напишите какую-нибудь логику для короткиестики Подробную ссылку Проверьте это Проектирование укороченной службы URL, как Tinyurl

Это будет генерировать случайное значение ключа длины 7 с комбинацией прописных, строчных и цифр. N можно скорректировать, как мы хотим

import string, random 
# hash length
N = 7
s = string.ascii_uppercase + string.ascii_lowercase + string.digits
# generate a random string of length 7
url_id = ''.join(random.choices(s, k=N))

Преобразуйте логику на функцию, и она создаст новую запись в таблице для каждого нового URL-адрес короткого запроса

import string, random 
from short.models import URL

def shortit(long_url):
    # hash length
    N = 7
    s = string.ascii_uppercase + string.ascii_lowercase + string.digits
    # generate a random string of length 7
    url_id = ''.join(random.choices(s, k=N))
    # check the hash id is in
    if not URL.objects.filter(hash=url_id).exists():
        # create a new entry for new one
        create = URL.objects.create(full_url=long_url, hash=url_id)
        return url_id
    else:
        # if hash id already exists create a new hash
        shortit(url)

Эта функция просмотра получит запрос и использует приведенную выше функцию для преобразования его

from django.http import JsonResponse
from django.contrib.sites.shortcuts import get_current_site
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def short_url(request):
    long_url = request.POST.get("url")
    # get the unique id for long url
    hash = shortit(long_url)
    # get the host url
    current_site = get_current_site(request)
    data = {
        "success": True,
        "id": hash,
        "link": "http://{}/{}".format(current_site, hash),
        "long_url": long_url
    }
    return JsonResponse(data)

Свяжите эту функцию представления для коротких/URLS.PY Список URLPatterns

   path('shorten', views.short_url, name="ShortUrl"),

Теперь давайте сделаем извлечение логики Redis – магазин структуры данных в памяти Мы будем использовать Redis в качестве хранилища кэша, я использую Redis в моей локальной системе

import redis
# host - running host
# port - the port in which its running
# db - by default 0 is the default db, you can change it
rds = redis.Redis(host='localhost', port=6379, db=0)

Просто запустите его, используя Redis-Server После того, как сервер Redis останавливается, данные будут очищены.

from django.shortcuts import redirect

def redirector(request,hash_id=None):
    # get the value from redis key, if value not in return None
    hash_code = rds.get(hash_id)
    if hash_code is not None:
        return redirect(hash_code.decode('ascii'))

    if URL.objects.filter(hash=hash_id).exists():
        url = URL.objects.get(hash=hash_id)
        # set the value in redis for faster access
        rds.set(hash_id,url.full_url)
        # redirect the page to the respective url
        return redirect(url.full_url)
    else:
        # if the give key not in redis and db
        return JsonResponse({"success":False})

Примечание. Redis в Python 3 Всегда возвращайте двоичную строку для того, чтобы мы использовали декодировать (‘ascii’)

Свяжите функцию вида редиректора в коротких/URLS.PY Список URLPatterns

    path('/', views.redirector, name="Redirector"),

Hash_id – это параметры URL, используемые для получения значения от URL

Сделано правильно это структура проекта

Спасибо вам, хорошего дня вперед. 🤪😎.

Оригинал: “https://dev.to/magesh236/build-url-shortener-api-in-django-redis-gj8”