Django로 URL Shortener 앱 구축 가이드
게시 됨: 2021-05-09Django 또는 모든 기술을 배우는 가장 좋은 방법은 기능적 프로젝트를 만들어 지식을 적용하는 것입니다.
Django는 가장 많이 사용되는 Python 웹 개발 프레임워크입니다. 내장 기능과 방대한 양의 타사 패키지로 인해 전 세계에서 가장 사랑받는 웹 프레임워크 중 하나가 되었습니다.
빠르고 안정적이며 많은 내장 기능이 있습니다. 예를 들어 앱의 주요 기능에 집중할 수 있는 구멍 인증 시스템이 있습니다. 또한 외부 패키지를 설치하여 소셜 계정에 사용자를 등록할 수 있는 Django-allauth 와 같은 훨씬 더 복잡한 작업을 수행할 수 있습니다.
그러나 몇 가지 사실을 폭로합시다. Django는 때때로 시작하기 어려운 거대한 프레임워크입니다.
그래서 오늘은 완전히 기능적인 Django 애플리케이션을 처음부터 빌드할 것입니다.
이 튜토리얼을 마치면 다음을 수행하게 됩니다.
- URL 단축 앱을 작성했습니다.
- Django MVT 패턴 이해
- 프로젝트 생성 워크플로를 배웠습니다.
사전 요구 사항
다음 요구 사항은 모두 선택 사항이며 자습서를 따라 하는 데 도움이 됩니다. 그러나 이러한 경험이 없더라도 걱정하지 마십시오. 가장 중요한 단계는 첫 번째 단계입니다.
- UNIX 명령(ls, cd, rm, touch)에 대한 기본 이해
- Python 클래스 및 함수에 대한 기본 이해
- 컴퓨터에 설치된 Python(명백하지만 포함해야 함)
- 이미 Django로 무언가를 구축했다면 좋을 것입니다.
모든 작업 코드는 이 Github 리포지토리에서 사용할 수 있습니다.
이제 이전 개념을 명확하게 이해했으므로 문제에 대해 알아보겠습니다.
프로젝트 명세서
이 튜토리얼에서는 URL 단축기를 구축할 것입니다. 기본적으로 URL Shorter는 긴 URL을 압축해서 만들어주는 서비스입니다.
예를 들어, 트윗을 공유하고 웹사이트 링크를 포함하고 싶지만 글자 수 제한에 직면한 경우 URL 단축기를 사용할 수 있습니다.
그래픽으로 봅시다.

보시다시피 URL 단축기는 긴 URL을 가져오고 짧은 URL을 반환합니다. 그것이 바로 오늘 당신이 만들 것입니다.
이 프로젝트를 통해 MVT 패턴의 사용을 연습하고 Django 모델을 사용한 데이터베이스 디자인의 기본 사항을 배우고 뷰, URL 및 템플릿을 통해 사용자에게 정보를 표시하는 방법을 배웁니다.
Django 프로젝트의 구조
기본적으로 Django 웹사이트는 단일 프로젝트 와 여러 개의 분리된 앱을 기반으로 합니다. 이러한 각 앱에는 특정 기능이 있으며 자체적으로 작동할 수 있습니다.
Stackoverflow와 같은 복잡한 웹 애플리케이션을 상상해 봅시다. 그 기능은 두 가지 주요 측면을 기반으로 합니다.
- 사용자 관리: 로그인, 로그아웃, 평판, 권한
- 포럼: 질문, 답변, 태그, 필터
따라서 Django 웹 사이트 구조에 따라 프로젝트 이름은 두 개의 기본 앱이 있는 StackOverflow 로 지정됩니다. 사용자 앱과 포럼 앱.
이러한 각 앱에는 자체 기능이 있습니다. 즉, 둘 다 제대로 작동하는 데 필요한 모든 코드가 포함되어 있습니다.
여기에는 모델(데이터베이스 구조), 보기(요청 및 응답), 특정 URL 패턴, 그리고 템플릿 및 정적 파일(이미지, CSS, JavaScript)이 포함됩니다. 이것은 모든 Django 앱이 스스로 작동할 수 있기 때문에 재사용할 수 있음을 의미합니다.
단축, 프로젝트는 웹 응용 프로그램을 빌드하기 위한 구성 및 앱 집합을 나타냅니다. 반면에 Django 앱은 자체 포함된(작동에 필요한 모든 것이 있음) 프로젝트의 일부이며 그 목적은 특정 작업을 수행하는 것입니다.
Django 프로젝트 설정
이 섹션에서는 Django 프로젝트를 설정합니다. 이를 위해 가상 환경과 같은 다양한 도구를 사용하여 Python 종속성과 가장 중요한 Django 스크립트를 구성할 것입니다. Django-admin 및 manage.py
가상 환경
Django로 앱을 빌드할 때는 항상 가상 환경에서 작업하는 것이 좋습니다. 특정 종속성 집합을 유지 관리하는 가장 효율적인 방법입니다. 그러나 주요 목적은 개발 패키지를 전역 패키지에서 분리하는 것입니다.
그럼 python에 내장된 form 명령어로 가상 환경을 만들어 봅시다.
참고: 이 방법을 사용하려면 Python 3.6 이상 버전이 필요합니다.
python -m venv .venv이 명령은 python -m 또는 python –mod 명령을 사용합니다. 기본적으로 모듈이나 라이브러리를 스크립트로 실행합니다. 이 명령의 의미에 따르면 venv 는 실행 중인 라이브러리이고 .venv 는 생성하려는 가상 환경의 이름을 나타냅니다.
따라서 일반 언어로 이 명령은 의미합니다.
Hey 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참고: $ 는 쉘 기호일 뿐임을 기억하십시오.
설치가 제대로 되었는지 확인하기 위해 venv의 설치된 패키지를 다시 확인합니다.
$ 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/ 폴더가 있고 그 안에 많은 파일이 있습니다. 나중에 우리는 프로젝트의 파일 구조를 볼 것입니다. 일단은 프로젝트 디렉토리를 입력하고 로컬 서버를 실행해보자.
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.py 및 wsgi.py 파일에 대해 너무 걱정하지 마십시오. 배포 시 애플리케이션을 구성할 수 있는 파일입니다.
manage.py 는 Django-admin에서 사용 가능한 모든 명령을 실행할 수 있는 python 스크립트입니다.
방금 만든 앱의 이름인 urlshortener 내부를 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 개발자가 웹 애플리케이션을 만들 때 사용하는 소프트웨어 디자인 패턴입니다.

3가지 주요 개념을 기반으로 합니다. 모델(데이터), 보기(데이터와 사용자 상호 작용), 템플릿(사용자가 데이터를 보는 방식).
모델은 저장하려는 데이터의 모든 필드와 동작을 정의하는 Python 클래스입니다. 일반적으로 각 모델은 데이터베이스의 고유한 테이블을 참조합니다.
가장 간단한 표현으로 보기는 사용자의 요청을 받아 응답을 생성하는 호출 가능 항목입니다. 그 프로세스 사이에 비즈니스 로직이 발생합니다. 나는 "비즈니스 로직"이 꽤 모호한 개념이라는 것을 알고 있으므로 그것이 무엇인지 정확히 설명하겠습니다. 비즈니스 로직은 데이터가 생성, 저장 및 삭제되는 방식입니다. 그게 전부입니다.
마지막으로 템플릿은 사용자에게 표시되는 텍스트 문서(보통 Html)입니다. 그 목적은 데이터를 가능한 한 깔끔하게 표시하는 것입니다. Django는 Django 템플릿 언어(DTL)라고 하는 미니 언어를 통합하여 텍스트 문서에 파이썬의 일부 기능을 통합할 수 있습니다.
Shortener 모델 생성
MVT 패턴을 빠르게 파악했다면 Django URL 단축기 생성을 처음부터 시작해 보겠습니다.
먼저 models.py 파일 안에 models.py 모델을 정의해 봅시다.
''' 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}'알아요. 이상한 일들이 많이 일어나는 꽤 거대한 수업이지만 절망하지 마십시오. 중요한 것 하나하나 짚고 넘어가겠습니다.
모델 설명
먼저 models 모듈을 가져옵니다. 이 모듈에는 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.objects.all()을 호출하는 순서가 가장 최근 객체로 구분되도록 설정합니다.
__str__ 메소드는 모델이 어떻게 인쇄되어야 하는지 알려줍니다. 따라서 long_url = "https://geekflare.com/"이고 단축 부분이 "123456"인 개체가 있고 인쇄하면 됩니다.
https://geekflare.com/ to 123456이제 짧은 링크를 무작위로 저장하는 방법을 찾아볼 차례입니다.
단축 기능 생성
우리는 2개의 사용자 정의 함수를 만들 것입니다. 첫 번째는 무작위 코드를 생성하고 두 번째는 Shortener 모델에서 반복되는 무작위 코드를 얻는 것을 방지합니다. 이렇게 하려면 "urlshortener" 앱 내부에 utils.py 파일을 만듭니다.
touch utils.py이 파일 내부에서 랜덤 내장 모듈의 선택 기능을 사용할 것입니다. 이것은 코드를 생성하기 위해 임의의 문자를 선택하는 작업을 용이하게 합니다.
''' 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개의 장소가 있는 경우 가능한 순열은 다음과 같습니다.

따라서 이러한 빠른 계산을 기반으로 단축된 부분은 최대 2조 5천억 개의 서로 다른 코드를 채울 수 있습니다. 따라서 임의의 단축 URL에서 벗어나는 것을 잊을 수 있습니다.
이렇게 많은 순열이 있을 수 있지만, 반복되는 단축 부품의 확률은 적습니다. 이것은 우리가 shortened_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) save 메소드를 덮어쓰는 중입니다. 즉, 기존 상위 메소드에 새로운 기능을 도입한다는 의미입니다. 기본적으로 Django에게 "Shortener" 객체가 저장되고 short_url 이 지정되지 않을 때 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://geekflare.com") >>> s.short_url '' >>> s.save() >>> s.short_url 'kdWFVIc' >>> s.long_url 'https://geekflare.com' >>> print(s) https://geekflare.com to kdWFVIc이것이 모든 쇼트너 개체가 작동하는 방식입니다.
쓰기 보기
전에 말했듯이 뷰는 요청을 받고 응답을 반환하는 간단한 함수입니다. 그럼 Hello World View를 만드는 방법을 알아봅시다.
기본 템플릿 응답
"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 패턴이 표시됩니다.
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 앱의 네임스페이스를 선언합니다.
앱의 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 단축 앱의 url 패턴을 전체 프로젝트에 포함하기 때문입니다.

이것은 시작점일 뿐입니다. 이제 사용자가 스스로 단축 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',)사용자 입력에서 모델 개체를 만드는 것이 목적이므로 모델 형식입니다. 또한 "class"(파이썬이 아닌 CSS의 클래스) 속성을 지정할 수 있는 위젯 인수를 사용합니다. 나중에 부트스트랩으로 앱을 스타일화할 것이기 때문입니다.
보기 마무리
폼을 빌드한 후에는 애플리케이션의 최종 비즈니스 로직을 생성할 시간입니다.
단축기 앱 내부의 views.py 파일로 이동하여 home_view 보기를 수정합니다. 현재 Github repo를 확인하여 프로젝트 구조가 어떻게 생겼는지 알 수 있습니다.
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 사용하는 build_absolute_uri 입니다.
>>> print(request.build_absolute_uri('/')) 'https://localhost:8080/'잘못된 요청(사용자가 유효한 URL을 입력하지 않음)을 처리하는 안전한 방법으로 양식 오류가 발생하고 이를 컨텍스트로 전달하고 템플릿을 정상적으로 렌더링합니다. 나중에 템플릿에서 오류 표시를 구현하는 방법을 볼 수 있습니다.
보기 리디렉션
redirect_url_view 는 조금 더 간단합니다. 이것은 뷰가 객체에만 작동한다는 것을 의미하는 상세 뷰입니다.
이 함수는 사용자의 요청과 URL의 shorted_part 를 매개변수로 사용합니다. 이 보기에서 양식으로 작업하지 않기 때문에 받고 있는 요청 유형을 주장할 필요가 없습니다.
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을 추가하고 HttpResponseRedirect 함수를 사용하여 임의 코드에 해당하는 사이트 URL로 리디렉션합니다.
URL 업데이트
앱의 두 가지 보기를 생성했으면 이제 redirect_url_view 대한 경로를 포함하여 최종 URL 패턴을 생성할 차례입니다.
언제나처럼 보기를 가져온 다음 경로 함수를 만들고 인수로 전달하여 시작합니다.
- URL 경로
- 길을 가리키는 모습
- 경로의 이름
''' Urls for shortener app urlshortener/urls.py ''' from django.urls import path # Import the home view from .views import home_view, redirect_url_view appname = "shortener" urlpatterns = [ # Home view path('', home_view, name='home'), path('<str:shortened_part>', redirect_url_view, name='redirect'), ]이 URL 설정으로 앱의 라우팅은 다음과 같습니다.
-
localhost:8000/: 홈 보기 -
localhost:8000/URL-code: 긴 URL로 리디렉션
템플릿 만들기
거의 다 왔습니다. 이 앱을 구축하는 것과 당신을 구분하는 유일한 것은 사용자 인터페이스입니다. 이를 위해 Django 템플릿을 사용합니다.
템플릿은 앱 사용자에게 깨끗한 인터페이스를 제공하는 데 사용됩니다. 이러한 파일은 "templates/appname" 형식의 이중 폴더 구조로 앱 내부에 생성됩니다.
# urlshortener directory mkdir -p templates/urlshortener/참고: 이중 폴더 구조와 Django 템플릿 언어는 이 튜토리얼의 범위를 벗어나지만 공식 문서에서 읽을 수 있습니다.
기본 템플릿
Django는 템플릿 상속을 허용합니다. 이것은 기본 템플릿을 가지고 DRY(자신을 반복하지 마십시오) 원칙을 따르는 목적으로 확장할 수 있음을 의미합니다.
cd templates/urlshortener touch base.htmlbase.html 파일은 규칙이며 앱의 다른 모든 템플릿이 이 템플릿의 확장이어야 함을 의미합니다.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Django Url shortener</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-wEmeIV1mKuiNpC+IOBjI7aAzPcEZeedi5yW5f2yOq55WWLwNGmvvx4Um1vskeMj0" crossorigin="anonymous" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous" /> </head> <body> {% block body %} {% endblock body %} <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-p34f1UUtsS3wqzfto5wAAmdvj+osOnFyQFpp4Ua3gs/ZVWx6oOypYoCJhGGScy+8" crossorigin="anonymous" ></script> </body> </html>부트스트랩 CDN을 사용하여 CSS나 자바스크립트 파일 없이 빠르고 예쁜 인터페이스를 만들 것입니다.
DTL 태그에 대해 자세히 알고 싶다면 공식 문서에서 할 수 있습니다.
홈 템플릿
base.html 파일에서 가져온 홈 템플릿입니다. 즉, 이 템플릿에는 상위 파일의 모든 HTML이 포함됩니다.
{% extends 'urlshortener/base.html' %} {% block body %} <div class="container"> <div class="card mt-5"> <div class="card-header text-center py-3"> <h1>URL Shortner Application <i class="fas fa-link px-2"></i></h1> </div> <div class="px-3 py-4"> <form action="" method="POST"> {% csrf_token %} <div class="row g-1"> <div class="col-10">{{form.long_url}}</div> <div class="col-2"> <button class="btn btn-success btn-lg w-100" type="submit"> Shorten </button> </div> </div> </form> </div> </div> {% if errors %} <div class="alert alert-danger mt-4" role="alert"> <p>{{errors}}</p> </div> {% endif %} {% if new_url %} <div class="mx-auto text-center mt-5"> <h2 class="text-danger">Your shortened Url</h2> <p>You can copy the Link below and share it with your friends</p> <p class="">{{new_url}}</p> <p><span class="text-danger">Previous URL:</span> {{long_url}}</p> </div> {% endif %} </div> {% endblock body %}이 템플릿의 데이터 흐름을 빠르게 설명하겠습니다.
- 단축기 양식이 표시됩니다. 내부에는 crsf 토큰이 설정되어 있고(보안상의 이유), 양식의 긴 URL 필드만 표시됩니다. 이 필드에는 "form-control form-control-lg"라는 CSS 클래스가 있다는 것을 기억하세요.
- 오류가 발견되면 표시하십시오.
- POST 작업이 성공하면 새 URL이 표시됩니다.
최종 지원서
축하합니다! . Django로 완전한 기능의 URL 단축 앱을 구축했습니다.
다음은 애플리케이션이 어떻게 생겼는지에 대한 스크린샷입니다.
다음 항목만 가져오기:

URL 단축 오류:

성공적인 단축 URL:

리디렉션된 URL:

이 URL 단축 앱의 데모를 누군가에게 공개하는 것에 대해 어떻게 생각하시나요? Django Demo 앱을 인터넷에 노출하는 방법을 확인하세요.
도전
Django 기술에 익숙해지면 챌린지로 연습해 보는 건 어떨까요?
이 응용 프로그램의 코드를 복제하고 등록된 사용자만 URL을 단축할 수 있는 인증 시스템을 만듭니다.
완료되면 풀 리퀘스트를 보내고 Twitter에서 저에게 핑을 보내 성과를 보여주세요.
마무리
이 튜토리얼의 끝에 도달했습니다. 믿거나 말거나, 방금 Django 프로젝트 생성의 모든 주요 측면을 검토했습니다. 매우 유용하게 사용하셨기를 바랍니다.
이 자습서에서는 다음을 수행합니다.
- Django 앱을 만드는 워크플로에 대해 배웠습니다.
- 이력서 프로젝트 구축
- Django 프로젝트와 Django 앱의 차이점과 구조를 이해했습니다.
- MVT 패턴을 발견했습니다.
- 생성된 함수 기본 보기
- Django ORM(Object Relational Mapper)을 사용하여 간단한 모델 생성
그게 다야, Django 웹 프레임워크로 다룰 내용이 많으므로 더 놀라운 튜토리얼을 위해 계속 연락하십시오.
