Django에서 Url Shortener API 빌드 - Redis

django와 redis를 사용하여 간단한 Url Shortener를 만들고 데이터는 SQLite에 저장하고 redis는 캐시 저장소로 사용됩니다.

이 프로젝트에 대한 가상 환경 설정

, so it will not affect the projects in your machine.

Installing the dependency for the project

pip install django
pip install redis

above command will install the latest version of the packages

장고 프로젝트 설정



django에 대한 자세한 내용은 페이지를 참조하십시오.
이제 프로젝트를 만들 수 있습니다.

django-admin startproject urlshortener
cd urlshortener


성공적으로 실행되는 앱을 확인하려면 로켓 페이지가 열립니다(터미널에서 미적용 마이그레이션을 볼 수 있으며 마이그레이션에서 볼 수 있습니다).

python manage.py runserver




아래 명령은 urlshortener 내부에 앱 호출 short(로직이 작성되는 위치)를 생성합니다.

python manage.py startapp short


이제 settings.py에 짧은 앱을 추가해야 합니다. 이것은 django가 모델의 변경 사항을 식별하는 데 도움이 됩니다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'short',
]




장고 모델이란 무엇입니까?

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'),
    }
}




모델

이제 이 코드를 short/models.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


그러면 story/migrations 디렉토리 내에 마이그레이션 파일이 생성되고 변경 사항을 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")),
]


이제 short/views.py에 홈이라고 하는 간단한 HttpResponse 보기를 작성할 수 있습니다.

from django.http import HttpResponse

def home(request):
    current_site = get_current_site(request)
    return HttpResponse("<h1>Url Shortener</h1>")


그런 다음 보기를 URL과 연결하십시오.

from django.urls import path
from short import views

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


홈 URL(http://127.0.0.1:8000/)을 열면 HttpResponse가 표시됩니다.


프로젝트가 잘 작동합니다. 이제 쇼트너용 로직을 작성해 보겠습니다.
자세한 내용은 여기를 확인하세요Designing a URL Shortening service like 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)


이 보기 기능을 short/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})


참고: Python 3의 redis는 항상 decode('ascii')를 사용한 이진 문자열을 반환합니다.

short/urls.py urlpatterns 목록에서 리디렉터 보기 기능을 연결합니다.

    path('<str:hash_id>/', views.redirector, name="Redirector"),


hash_id는 url에서 값을 가져오는 데 사용되는 URL 매개변수입니다.





DONE RIGHT, 이것이 프로젝트 구조입니다.


감사합니다. 좋은 하루 되세요.🤪😎

좋은 웹페이지 즐겨찾기