매일 업데이트
2022-11-20 11:35 24 min

Django로 URL Shortener 앱 구축 가이드

Django로 URL 단축기 앱 만들기: 종합 가이드

기술 학습에 있어 가장 효과적인 방법 중 하나는 실제 작동하는 프로젝트를 만들고, 습득한 지식을 실질적인 문제 해결에 적용하는 것입니다. Django는 강력하고 널리 사용되는 Python 웹 프레임워크로서, 다양한 내장 기능과 광범위한 확장 라이브러리 덕분에 전 세계 개발자들에게 사랑받고 있습니다.

Django의 장점은 속도, 안정성 및 다양한 내장 기능입니다. 예를 들어, Django는 기본적으로 사용자 인증 시스템을 제공하여 개발자가 앱의 핵심 기능에 집중할 수 있게 해줍니다. 또한, Django-allauth와 같은 외부 패키지를 활용하면 소셜 계정 연동과 같은 복잡한 기능을 쉽게 구현할 수 있습니다.

하지만, Django는 초보자에게는 다소 복잡해 보일 수 있습니다. 따라서, 이 튜토리얼에서는 완전히 작동하는 Django 애플리케이션을 처음부터 함께 만들어 볼 것입니다.

이 튜토리얼을 마치면 여러분은:

  • URL 단축기 앱을 개발합니다.
  • Django MVT 패턴에 대한 이해도를 높입니다.
  • Django 프로젝트 생성 과정을 숙지합니다.

필수 조건

다음 항목들은 튜토리얼을 따라하는 데 도움이 되지만, 필수는 아닙니다. 경험이 없더라도 걱정하지 마십시오. 중요한 것은 첫 번째 단계를 시작하는 것입니다.

  • UNIX 명령어(ls, cd, rm, touch)에 대한 기본 이해
  • Python 클래스 및 함수에 대한 기본적인 이해
  • 컴퓨터에 Python이 설치되어 있어야 함 (기본 사항이지만 명시)
  • Django를 사용하여 간단한 프로젝트를 구축해 본 경험이 있다면 더 좋습니다.

모든 소스 코드는 다음 GitHub 저장소에서 확인할 수 있습니다. Github 저장소.

이전 개념들을 이해하셨으리라 믿고, 이제 프로젝트를 시작해 보겠습니다.

프로젝트 설명

이 튜토리얼에서는 URL 단축기를 만들 것입니다. URL 단축기는 긴 URL을 짧고 간결한 URL로 변환해 주는 서비스입니다.

예를 들어, 트윗에 웹사이트 링크를 공유하고 싶지만 글자 수 제한이 있는 경우, URL 단축기를 사용하면 문제를 해결할 수 있습니다.

간단한 그림으로 살펴봅시다.

그림과 같이, URL 단축기는 긴 URL을 입력받아 짧은 URL을 생성합니다. 이 튜토리얼에서는 바로 이러한 기능을 구현할 것입니다.

이 프로젝트를 통해 MVT 패턴의 사용법을 익히고, Django 모델을 활용한 데이터베이스 설계 기초를 다지고, 뷰, URL 및 템플릿을 통해 사용자에게 정보를 표시하는 방법을 배우게 됩니다.

Django 프로젝트 구조

Django 웹사이트는 일반적으로 하나의 프로젝트와 여러 개의 분리된 앱으로 구성됩니다. 각 앱은 특정 기능을 담당하며, 자체적으로 작동할 수 있습니다.

예를 들어, Stack Overflow와 같은 복잡한 웹 애플리케이션을 생각해 봅시다. Stack Overflow의 기능은 크게 두 가지 주요 측면으로 나눌 수 있습니다.

  • 사용자 관리: 로그인, 로그아웃, 평판, 권한
  • 포럼: 질문, 답변, 태그, 필터

Django 웹사이트 구조에 따라 프로젝트 이름은 "StackOverflow"로 지정하고, 두 개의 기본 앱인 "사용자 앱"과 "포럼 앱"으로 구성할 수 있습니다.

각 앱은 독립적인 기능을 가지며, 자체적으로 작동하는 데 필요한 모든 코드를 포함합니다. 여기에는 모델(데이터베이스 구조), 뷰(요청 및 응답 처리), URL 패턴, 템플릿 및 정적 파일(이미지, CSS, JavaScript)이 포함됩니다. 따라서, Django 앱은 재사용이 가능하며 독립적으로 작동할 수 있습니다.

간단히 말해, 프로젝트는 웹 애플리케이션을 구축하기 위한 설정 및 앱 모음입니다. 반면에 Django 앱은 프로젝트의 일부이며, 자체적으로 작동하고 특정 작업을 수행하는 것을 목표로 합니다.

Django 프로젝트 설정

이 섹션에서는 Django 프로젝트를 설정합니다. 가상 환경을 비롯한 여러 도구를 사용하여 Python 종속성 및 Django 스크립트(django-admin 및 manage.py)를 구성합니다.

가상 환경

Django 앱을 개발할 때는 항상 가상 환경을 사용하는 것을 권장합니다. 가상 환경은 특정 프로젝트의 종속성을 관리하는 가장 효율적인 방법이며, 개발 패키지를 글로벌 패키지와 분리하는 주요 목적을 가지고 있습니다.

이제 Python에 내장된 venv 모듈을 사용하여 가상 환경을 만들어 보겠습니다. 참고: 이 방법은 Python 3.6 이상 버전이 필요합니다.

python -m venv .venv

이 명령어는 python -m 또는 python --mod 명령을 사용하며, 기본적으로 모듈이나 라이브러리를 스크립트로 실행합니다. 이 명령어는 venv 라이브러리를 실행하고, .venv라는 이름으로 가상 환경을 생성한다는 의미입니다.

간단하게 말하면, 이 명령어는 "Python, 내장 라이브러리 venv를 스크립트로 실행하고, virtualenv 이름 .venv를 만들어줘"라는 의미입니다.

이제 다음 명령어를 사용하여 생성한 가상 환경을 활성화합니다.

source .venv/bin/activate

새로운 가상 환경에 패키지가 설치되지 않았는지 확인하려면 다음 명령어를 실행합니다.

pip freeze

가상 환경이 올바르게 활성화되었다면, 아무런 출력도 표시되지 않을 것입니다. 아직 아무것도 설치하지 않았기 때문입니다.

Django 설치

URL 단축기 애플리케이션을 만들기 위해 Django 패키지를 설치하는 것으로 시작하겠습니다. Django는 타사 패키지이므로, Pip(Pip Installs Packages)를 사용하여 설치해야 합니다.

$ pip install django
Collecting django
  Downloading Django-3.2.1-py3-none-any.whl (7.9 MB)
     |████████████████████████████████| 7.9 MB 344 kB/s 
Collecting asgiref<4,>=3.3.2
  Using cached asgiref-3.3.4-py3-none-any.whl (22 kB)
Collecting sqlparse>=0.2.2
  Using cached sqlparse-0.4.1-py3-none-any.whl (42 kB)
Collecting pytz
  Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB)
Installing collected packages: asgiref, sqlparse, pytz, django
Successfully installed asgiref-3.3.4 django-3.2.1 pytz-2021.1 sqlparse-0.4.1

참고: $는 쉘 프롬프트를 나타낼 뿐입니다.

설치가 제대로 되었는지 확인하기 위해 가상 환경에 설치된 패키지를 다시 확인합니다.

$ pip freeze
asgiref==3.3.4
Django==3.2.1
pytz==2021.1
sqlparse==0.4.1

표시되는 버전이 다를 수 있지만, Django 버전이 3.x로 시작한다면 문제없이 계속할 수 있습니다.

Django 프로젝트 시작

Django를 설치했으므로, 이제 URL 단축기 웹사이트의 구조를 만들 차례입니다. Django 프로젝트가 무엇인지 기억하십니까? 다음 명령어를 실행하여 하나 만들어 보겠습니다.

django-admin startproject config

django-admin은 Django 프로젝트를 생성하는 데 필요한 모든 작업을 수행하는 명령줄 유틸리티입니다. startproject는 Django-admin 유틸리티에 의해 실행되는 명령어이고, config는 생성할 프로젝트의 이름입니다.

config는 원하는 이름으로 변경할 수 있다는 점을 기억해 주세요. 이 프로젝트에서 config를 사용하는 이유는 편의성 때문입니다. 프로젝트를 변경하면서도 동일한 명명 규칙을 유지하는 것이 좋습니다. 따라서, 원한다면 다른 프로젝트 이름을 자유롭게 사용하세요.

이제 config/ 폴더가 생성되었고, 그 안에 여러 파일이 있는 것을 볼 수 있습니다. 나중에 프로젝트의 파일 구조를 자세히 살펴보겠습니다. 지금은 프로젝트 디렉터리로 이동하여 로컬 서버를 실행해 보겠습니다.

cd config/

가장 중요한 파일은 manage.py 스크립트입니다. django-admin과 기능은 비슷하지만, 프로젝트 실행 시 설정을 관리할 수 있다는 장점이 있습니다.

이제 모든 것이 제대로 작동하는지 확인해 봅시다.

python manage.py runserver

URL 단축기 앱 만들기

이제 프로젝트의 기본 앱을 만들 차례입니다. manage.py 파일을 사용하여 앱을 생성합니다.

python manage.py startapp urlshortener

이 명령어를 실행하면 urlshortener라는 Django 앱이 생성됩니다. 실행 후, tree 명령어를 실행하면 다음과 같은 결과를 확인할 수 있습니다.

.
├── config
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
└── urlshortener
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

지금까지 생성된 다른 파일들을 정리해 보겠습니다. "config"는 프로젝트 이름이며, 일관성을 위해 지정되었습니다. config 폴더 안에는 프로젝트의 모든 설정을 지정하는 settings.py 파일이 있습니다. urls.py 파일은 프로젝트 전체의 URL 구성 정보가 들어있는 곳입니다. 프로젝트 내의 모든 애플리케이션의 URL 경로를 정의합니다.

asgi.pywsgi.py 파일에 대해서는 너무 걱정하지 마십시오. 배포 시 애플리케이션을 구성하는 데 사용되는 파일입니다.

manage.py는 사용 가능한 모든 명령어를 실행할 수 있는 Python 스크립트입니다. Django 관리자.

이제 막 생성된 urlshortener 앱 내부를 살펴보면, migrations/라는 폴더와 앱의 로직에 중요한 여러 파일들이 있는 것을 확인할 수 있습니다.

apps.py는 앱 설정이 저장되는 곳입니다. 일반적으로 매우 고급 작업을 수행하지 않는 한, 이 파일을 수정할 필요는 없습니다.

admin.py는 Django 관리자 패널에서 모델을 볼 수 있도록 모델을 등록하는 곳입니다.

models.py가 가장 중요한 파일입니다. 이 모듈에서 데이터를 저장하는 방법을 정의하는 모델을 생성합니다. 나중에 모델에 대해 자세히 알아보겠습니다.

migrations/는 Django 마이그레이션이 저장되는 폴더입니다. 이것도 나중에 자세히 살펴볼 것입니다.

tests.py는 테스트가 저장되는 파일입니다. 이 튜토리얼에서는 테스트를 다루지 않습니다.

views.py는 뷰를 저장하는 파일입니다. 기본적으로 사용자가 앱의 모든 측면과 상호 작용하는 방법을 정의합니다.

Django 앱 설치

계속하기 전에 settings.py 파일을 열고 urlshortener 앱을 추가하여 INSTALLED_APPS 변수를 수정합니다.

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Custom apps
    'urlshortener',
]

이것은 앱을 만들 때 거치는 일상적인 과정입니다. 따라서, 앱을 만들 때마다 프로젝트 설정에 설치하는 것을 잊지 마십시오.

MVT 패턴 이해

Model, View, Template 패턴은 Django 개발자가 웹 애플리케이션을 개발할 때 사용하는 소프트웨어 디자인 패턴입니다.

MVT 패턴은 크게 세 가지 개념으로 구성됩니다. 모델(데이터), 뷰(데이터와 사용자 상호 작용 처리), 템플릿(사용자에게 데이터를 표시하는 방법).

모델은 저장하려는 데이터의 모든 필드와 동작을 정의하는 Python 클래스입니다. 일반적으로 각 모델은 데이터베이스의 고유한 테이블을 참조합니다.

뷰는 가장 간단하게 표현하면 사용자로부터 요청을 받고 응답을 생성하는 호출 가능한 함수입니다. 이 과정에서 비즈니스 로직이 실행됩니다. "비즈니스 로직"이라는 개념이 다소 모호하게 들릴 수 있으므로, 정확히 무엇을 의미하는지 설명하겠습니다. 비즈니스 로직은 데이터가 생성, 저장 및 삭제되는 방식입니다. 이것이 전부입니다.

마지막으로 템플릿은 사용자에게 표시되는 텍스트 문서(일반적으로 HTML)입니다. 템플릿의 목적은 가능한 한 깔끔하게 데이터를 제공하는 것입니다. Django는 Django 템플릿 언어(DTL)라는 미니 언어를 통합하여 텍스트 문서에 Python의 기능을 일부 통합할 수 있도록 합니다.

단축기 모델 생성

MVT 패턴에 대한 이해를 바탕으로, 이제 Django URL 단축기를 처음부터 만들어 보겠습니다.

먼저, models.py 파일 안에 Shortener 모델을 정의해 보겠습니다.

'''
Url shortener model
'''

from django.db import models

# Create your models here.

class Shortener(models.Model):
    '''
    Creates a short url based on the long one
    
    created -> Hour and date a shortener was created 
    
    times_followed -> Times the shortened link has been followed

    long_url -> The original link

    short_url ->  shortened link https://domain/(short_url)
    ''' 
    created = models.DateTimeField(auto_now_add=True)

    times_followed = models.PositiveIntegerField(default=0)    

    long_url = models.URLField()

    short_url = models.CharField(max_length=15, unique=True, blank=True)

    class Meta:

        ordering = ["-created"]


    def __str__(self):

        return f'{self.long_url} to {self.short_url}'

네, 상당히 복잡해 보일 수 있지만, 걱정하지 마십시오. 중요 사항들을 하나씩 짚어보겠습니다.

모델 설명

가장 먼저 모델 모듈을 가져옵니다. 이 모듈에는 Django 모델을 생성하는 데 필요한 모든 기능이 포함되어 있습니다.

Shortener 모델을 살펴보면, 가장 먼저 주목해야 할 점은 models.Model을 상속받는다는 것입니다. 실제로, 모든 Django 앱의 모든 모델은 models.Model 클래스의 하위 클래스여야 합니다.

다음으로, 모델이 데이터베이스에 가질 모든 필드를 정의합니다. created 필드는 단축 링크가 생성된 날짜와 시간을 나타내므로, DateTimeField를 사용하여 이러한 종류의 기능을 생성합니다. 인스턴스가 생성될 때만 필드가 변경되도록 하려고 auto_now_add=True 인수를 사용합니다.

두 번째 필드인 times_followed는 단축 URL이 사용된 횟수를 나타냅니다. 이 필드는 PositiveIntegerField이며, 기본값을 0으로 지정합니다. 즉, 인스턴스가 times_followed 필드를 생성할 때마다 Django는 해당 필드를 0으로 채웁니다.

반면 long_url은 사용자가 입력한 URL을 의미합니다. 사용자가 http://yoursite.com 형식의 문자열만 입력하기를 원하므로, URLField를 사용합니다.

마지막 필드는 short_url이며, 몇 가지 흥미로운 세부 정보가 있습니다. 길이는 최대 15자까지만 가능하고 고유해야 한다고 지정합니다. 즉, 해당 필드에 중복된 값이 존재할 수 없습니다. 마지막으로, 비워둘 수 있음을 나타냅니다. 즉, 폼을 사용할 때 사용자가 단축 코드를 입력할 필요가 없습니다.

Meta 내부 클래스는 클래스의 동작을 정의합니다. Shortener 객체의 순서(Shortener.objects.all() 호출)를 최신 객체를 기준으로 정렬하도록 설정합니다.

__str__ 메서드는 모델을 인쇄하는 방법을 지정합니다. 예를 들어, long_url이 "https://koreantech.org.com/"이고 단축된 부분이 "123456"인 객체가 있을 때, 이 객체를 인쇄하면 다음과 같이 출력됩니다.

https://koreantech.org.com/ to 123456

이제 단축 링크를 임의로 생성하여 저장하는 방법을 알아볼 차례입니다.

단축 기능 만들기

두 개의 사용자 정의 함수를 생성합니다. 첫 번째 함수는 임의 코드를 생성하고, 두 번째 함수는 Shortener 모델에서 임의 코드가 반복되는 것을 방지합니다. 이를 위해 "urlshortener" 앱 안에 utils.py 파일을 만듭니다.

touch utils.py

이 파일 내에서, 내장된 random 모듈의 choice 기능을 사용합니다. 이렇게 하면 코드를 생성하기 위해 임의의 문자를 선택하는 작업이 쉬워집니다.

'''
Utilities for Shortener
'''
from django.conf import settings

from random import choice

from string import ascii_letters, digits

# Try to get the value from the settings module
SIZE = getattr(settings, "MAXIMUM_URL_CHARS", 7)

AVAIABLE_CHARS = ascii_letters + digits


def create_random_code(chars=AVAIABLE_CHARS):
    """
    Creates a random string with the predetermined size
    """
    return "".join(
        [choice(chars) for _ in range(SIZE)]
    )

보시다시피, 이 함수는 설정 파일에 지정된 길이 또는 기본적으로 7개의 임의의 문자열을 반환합니다. getattr 함수를 사용하여 설정 모듈에서 변수를 가져오지만, 변수가 지정되지 않은 경우에도 오류가 발생하지 않습니다.

계산을 해 봅시다. 각 위치에 대해 최대 62개의 문자를 사용할 수 있는 7개의 위치가 있다면 가능한 순열은 다음과 같습니다.

따라서 이러한 간단한 계산을 통해 단축 URL은 최대 2조 5천억 개의 서로 다른 코드로 채워질 수 있습니다. 따라서, 임의의 단축 URL이 부족할 일은 없을 것입니다.

이러한 많은 순열이 존재할 수 있지만, 단축된 부분이 반복될 가능성이 낮다고 하더라도 문제가 발생할 수 있습니다. shorted_url 필드를 고유하게 설정했기 때문입니다. 이러한 이유로, 다음 함수가 매우 유용합니다.

def create_shortened_url(model_instance):
    random_code = create_random_code()
    # Gets the model class

    model_class = model_instance.__class__

    if model_class.objects.filter(short_url=random_code).exists():
        # Run the function again
        return create_shortened_url(model_instance)

    return random_code

여기서 어떤 일이 일어나는지 살펴봅시다. 이 함수는 "Shortener" 모델 인스턴스를 인수로 사용합니다. 먼저 함수는 create_random_code를 사용하여 임의 코드를 생성합니다. 다음으로, 모델 클래스를 가져오고 동일한 short_url을 가진 다른 객체가 있는지 확인합니다. 만약 있다면 함수는 다시 실행되지만, 모든 것이 정상이라면 random_code를 반환합니다.

나중에 쉘에서 상호 작용하여 이 기능을 자세히 살펴보겠습니다.

유틸리티 함수를 생성했으니, 이제 단축기 모델에서 임의 코드를 생성하는 데 사용해 봅시다.

저장 방법 수정

"Shortener" 클래스 끝부분에서 모델 저장 방법을 수정합니다. save 메서드는 객체가 데이터베이스에 저장될 때마다 호출되므로, 여기서 사용법을 알아볼 수 있습니다.

# Import the function used to create random codes
from .utils import create_shortened_url

# At the end of the  Shortener model
    def save(self, *args, **kwargs):

        # If the short url wasn't specified
        if not self.short_url:
            # We pass the model instance that is being saved
            self.short_url = create_shortened_url(self)

        super().save(*args, **kwargs)

저장 방법을 덮어쓰고 있습니다. 즉, 기존 부모 메서드에 새로운 기능을 추가하고 있음을 의미합니다. 기본적으로 Django에게 "Shortener" 객체가 저장되고 short_url이 지정되지 않을 때마다, 임의 코드로 채워져야 한다고 알려주는 것입니다.

마이그레이션 실행

이제 Shortener 모델의 마이그레이션을 생성하고 실행할 차례입니다. 이를 위해, 루트 프로젝트 폴더에서 다음 명령어를 실행합니다.

$ python manage.py makemigrations
Migrations for 'urlshortener':
  urlshortener/migrations/0001_initial.py
    - Create model Shortener

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, urlshortener
Running migrations:
  ......
  # Apply the URL shortener migrations
  Applying urlshortener.0001_initial... OK

지금은 마이그레이션이 무엇인지 걱정할 필요가 없습니다. 이러한 두 가지 명령어를 실행하면, Django는 db.sqlite 데이터베이스를 생성하고, 정의한 모델을 기반으로 합니다.

Django 쉘을 사용하여 몇 가지 객체를 만들어 보겠습니다.

$ python manage.py shell

>>> from urlshortener.models import Shortener
>>> s = Shortener(long_url="https://koreantech.org.com")
>>> s.short_url
''
>>> s.save()
>>> s.short_url
'kdWFVIc'
>>> s.long_url
'https://koreantech.org.com'
>>> print(s)
https://koreantech.org.com to kdWFVIc

이것이 모든 Shortener 객체가 작동하는 방식입니다.

뷰 작성

앞서 언급했듯이 뷰는 요청을 받고 응답을 반환하는 간단한 함수입니다. 이제 "Hello world" 뷰를 만드는 방법을 살펴보겠습니다.

기본 템플릿 응답

urlshortener/views.py 파일 안에 home_view 함수를 생성합니다.

'''
Shortener views
'''
from django.shortcuts import render, get_object_or_404 # We will use it later

from django.http import HttpResponse 

# Create your views here.

def home_view(request):
    return HttpResponse("Hello world")

이 코드는 간단한 "Hello world" 메시지를 반환합니다. 나중에 브라우저에서 어떻게 보이는지 확인해 보겠습니다. 이제 "urls.py"를 생성하여 앱의 모든 URL 패턴을 표시합니다.

urls.py 생성:

touch urls.py

다음 코드를 추가합니다.

'''
Urls for shortener app urlshortener/urls.py
'''

from django.urls import path

# Import the home view
from .views import home_view

appname = "shortener"

urlpatterns = [
    # Home view
    path("", home_view, name="home")
]

appname 변수는 이름에서 알 수 있듯이 urlshortener 앱의 네임스페이스를 선언합니다.

가져오는 것에 대한 간단한 설명 path 함수는 앱의 urlpatterns에 포함될 요소를 반환합니다. name 속성은 필요한 경우 템플릿 내에서 호출할 수 있는 경로의 네임스페이스입니다.

이제 전체 프로젝트 URL을 수정해 보겠습니다.

# config/urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    
    # Shortener Urls
    path('', include('urlshortener.urls'))
]

이제 서버를 다시 실행해 봅시다.

python manage.py runserver

서버를 실행하면 간단한 "Hello world" 메시지가 표시됩니다. 이는 URL 단축기 앱의 urlpatterns를 전체 프로젝트에 포함시켰기 때문입니다.

이것은 시작일 뿐입니다. 이제 사용자가 직접 단축 URL을 만들 수 있는 폼을 만들 차례입니다.

폼 만들기

Django에서는 을 사용하여 사용자로부터 입력을 받을 수 있는 간단한 클래스입니다.

forms.py 파일을 만들 것입니다. 해당 파일에 앱의 모든 폼을 저장하는 것이 일반적인 관례입니다.

cd urlshortener/
touch forms.py

이 파일 안에서 "ModelForm"을 확장하는 "ShortenerForm" 클래스를 생성합니다.

'''
Shortener Forms urlshortener/forms.py
'''

from django import forms

from .models import Shortener

class ShortenerForm(forms.ModelForm):
    
    long_url = forms.URLField(widget=forms.URLInput(
        attrs={"class": "form-control form-control-lg", "placeholder": "Your URL to shorten"}))
    
    class Meta:
        model = Shortener

        fields = ('long_url',)

사용자 입력에서 모델 객체를 생성하는 것이 목적이므로 ModelForm입니다. 또한, 위젯 인수를 사용하여 "class" (Python이 아닌 CSS의 클래스) 속성을 지정할 수 있습니다. 나중에 Bootstrap을 사용하여 앱을 스타일링할 것이기 때문입니다.

뷰 마무리

폼을 만들었으므로 이제 애플리케이션의 최종 비즈니스 로직을 만들 차례입니다.

단축기 앱의 views.py 파일로 이동하여 home_view를 수정합니다. GitHub 저장소에서 이 시점에서 프로젝트 구조가 어떻게 생겼는지 확인할 수 있습니다.

URL 단축기 앱에는 두 개의 뷰가 있습니다.

  • 홈 뷰: 단축 폼을 표시하고, 폼이 제출된 경우 새로운 URL을 표시합니다.
  • 리디렉션 뷰: 긴 URL로 리디렉션하고 추적된 시간을 1 증가시킵니다.
  • 가장 복잡한 홈 뷰부터 시작하겠습니다. Shortener 모델과 폼을 가져와야 합니다. 뷰의 모든 데이터 흐름을 이해하고 싶기 때문에 함수형 뷰를 여전히 사용합니다. 또한, 템플릿의 경로도 사용하게 됩니다(아직 생성되지 않았음).

    홈 뷰

    '''
    Shortener views
    '''
    from django.shortcuts import render # We will use it later
    
    from django.http import HttpResponse, Http404, HttpResponseRedirect
    
    
    # Model
    from .models import Shortener
    
    # Custom form
    
    from .forms import ShortenerForm
    
    # Create your views here.
    
    def home_view(request):
        
        template="urlshortener/home.html"
    
        
        context = {}
    
        # Empty form
        context['form'] = ShortenerForm()
    
        if request.method == 'GET':
            return render(request, template, context)
    
        elif request.method == 'POST':
    
            used_form = ShortenerForm(request.POST)
    
            if used_form.is_valid():
                
                shortened_object = used_form.save()
    
                new_url = request.build_absolute_uri('/') + shortened_object.short_url
                
                long_url = shortened_object.long_url 
                 
                context['new_url']  = new_url
                context['long_url'] = long_url
                 
                return render(request, template, context)
    
            context['errors'] = used_form.errors
    
            return render(request, template, context)
    

    뷰는 두 가지 조건을 기준으로 작동합니다.

  • HTTP 메서드가 GET인 경우: Shortener 객체를 생성하는 데 사용되는 Shortener 폼이 포함된 컨텍스트를 전달합니다.
  • HTTP 메서드가 POST인 경우: 사용자가 다른 URL을 입력할 수 있도록 컨텍스트에서 폼을 전달합니다. 하지만 POST 요청은 used_form이라는 다른 폼으로 전달됩니다.
  • 전체 사이트 URL을 동적으로 가져오는 방법은 요청 객체의 메서드인 build_absolute_uri를 사용하는 것입니다.

    >>> print(request.build_absolute_uri('/'))
    'https://localhost:8080/'

    잘못된 요청(사용자가 유효한 URL을 입력하지 않은 경우)을 처리하는 안전한 방법으로, 폼 오류를 받아 컨텍스트에 전달하고 템플릿을 정상적으로 렌더링합니다. 나중에 템플릿에서 오류를 표시하는 방법을 알아보겠습니다.

    리디렉션 뷰

    redirect_url_view는 조금 더 간단합니다. 이 뷰는 객체에 대해서만 작동하는 상세 뷰입니다.

    이 함수는 사용자의 요청과 URL의 단축 부분을 파라미터로 사용합니다. 이 뷰에서는 폼을 사용하지 않으므로, 수신되는 요청 유형을 단정할 필요가 없습니다.

    def redirect_url_view(request, shortened_part):
    
        try:
            shortener = Shortener.objects.get(short_url=shortened_part)
    
            shortener.times_followed += 1        
    
            shortener.save()
            
            return HttpResponseRedirect(shortener.long_url)
            
        except:
            raise Http404('Sorry this link is broken :(')

    단축된 부분이 데이터베이스에서 발견되지 않은 경우를 대비하여 try/except 문을 사용하여 뷰를 보호합니다. 객체가 발견되면 times_followed 필드에 1

    저자
    Korea

    기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.