이 글에서는 Django로 URL 단축(URL Shortener) 앱을 만드는 방법을 단계별로 살펴봅니다. 이 앱은 사용자가 입력한 긴 URL을 짧은 URL로 변환해 주는 간단한 도구입니다. 특히 Django 전용 라이브러리가 아닌 범용 Python 라이브러리를 사용하기 때문에, 이 코드는 다른 어떤 Python 프로젝트에서도 그대로 재사용할 수 있다는 장점이 있습니다.
먼저 Django 프로젝트와 앱을 생성한 뒤, settings.py의 INSTALLED_APPS에 해당 앱을 등록하고 프로젝트의 urls.py에 앱의 URL 설정을 포함시키는 등 기본 설정을 완료해 주세요.
1단계: pyshorteners 라이브러리 설치
URL 단축 기능은 pyshorteners 모듈을 통해 구현합니다. 아래 명령어로 설치할 수 있습니다.
pip install pyshorteners
pyshorteners는 TinyURL, Bitly 등 다양한 URL 단축 서비스를 하나의 인터페이스로 사용할 수 있게 해주는 라이브러리입니다. 이 예제에서는 별도의 API 키 없이 바로 사용할 수 있는 TinyURL 서비스를 활용합니다.
2단계: URL 라우팅 설정 (urls.py)
앱의 urls.py에 아래와 같이 작성합니다.
from django.urls import path
from .views import url_shortner
urlpatterns = [
path('', url_shortner.as_view(), name="url-shortner"),
]
여기서는 사이트의 홈 URL('')에 url_shortner 뷰를 연결했습니다.
3단계: 뷰 작성 (views.py)
이제 views.py에 실제 로직을 담은 뷰를 작성합니다.
from django.shortcuts import render
import pyshorteners
from django.views import View
class url_shortner(View):
def post(self, request):
long_url = 'url' in request.POST and request.POST['url']
pys = pyshorteners.Shortener()
short_url = pys.tinyurl.short(long_url)
return render(request,'urlShortner.html', context={'short_url':short_url,'long_url':long_url})
def get(self, request):
return render(request,'urlShortner.html')
이 뷰는 두 개의 요청 핸들러 함수로 구성되어 있습니다.
- GET 핸들러: 사용자가 페이지에 처음 접속했을 때 URL 입력 폼이 있는 프론트엔드 HTML을 렌더링합니다.
- POST 핸들러: 폼에서 전송된 긴 URL을 받아 pyshorteners로 단축한 뒤, 단축된 URL과 원본 URL을 컨텍스트에 담아 프론트엔드를 다시 렌더링합니다.
4단계: 템플릿 작성 (urlShortner.html)
앱 디렉터리 안에 templates 폴더를 생성하고, 그 안에 urlShortner.html 파일을 추가한 후 아래 코드를 작성합니다.
<!DOCTYPE html>
<html>
<head>
<title>Url Shortner</title>
</head>
<body>
<div>
<h1>URL Shortner Application</h1>
<form method="POST">{% csrf_token %}
<input type="url" name="url" placeholder="Enter the link here" required>
<button>Shorten URL</button>
</form>
</div>
{% if short_url %}
<div>
<h3>Your shortened URL</h3>
<div>
<input type="url" id="short_url" value={{short_url}}> <button name="short-url">Copy URL</button> <small id="copied" class="px-5"></small>
</div>
<br>
<span><b>Long URL: </b></span> <a href="{{long_url}}">{{long_url}}</a>
</div>
{%endif%}
</body>
</html>
이 프론트엔드는 사용자가 긴 URL을 입력하면 POST 요청으로 서버에 전송하고, 응답으로 받은 단축 URL을 화면에 표시합니다. 또한 {% if short_url %} 조건문 덕분에 단축 결과가 존재할 때만 결과 영역이 나타나며, 복사 버튼과 원본 URL 링크도 함께 제공됩니다.
실행 결과

개발 서버를 실행한 뒤 긴 URL을 입력하고 "Shorten URL" 버튼을 누르면, TinyURL을 통해 생성된 짧은 URL이 화면에 출력되는 것을 확인할 수 있습니다. 이처럼 몇 줄의 코드만으로도 실용적인 URL 단축 서비스를 손쉽게 구축할 수 있습니다.