웹사이트를 개발하다 보면 특정 URL의 QR 코드를 생성해야 하는 경우가 종종 있습니다. QR 코드는 본인 인증, 웹사이트 로그인, 페이지 열기 등 다양한 용도로 스캔되며 활용 범위가 매우 넓습니다. 이 글에서는 Django를 사용해 qrgenerator 웹사이트를 구축하고 QR 코드를 생성하는 방법을 단계별로 살펴보겠습니다.
예제
먼저 Django 프로젝트와 앱을 생성합니다. 그다음 프로젝트 폴더 및 앱 폴더와 같은 위치에 media 폴더를 하나 만듭니다.
프로젝트 폴더 안의 settings.py 파일을 열어 INSTALLED_APPS에 앱 이름을 등록하고, 파일 하단에 아래 코드를 추가합니다.
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/') MEDIA_URL = '/media/'
이 설정은 생성된 QR 코드 이미지를 저장할 media 폴더를 지정하는 역할을 합니다.
프로젝트 디렉터리의 urls.py에 다음 내용을 추가합니다.
from django.contrib import admin
from django.urls import path,include
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
path("",include("qrgenerator.urls"))
]
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
여기서는 앱의 URL 경로와 미디어 파일 서빙 경로를 함께 정의했습니다. qrgenerator는 앱 이름입니다.
이제 QR 코드 생성에 필요한 두 가지 라이브러리인 PIL과 qrcode를 설치합니다.
pip install PIL pip install qrcode
앱의 urls.py 파일은 다음과 같이 작성합니다.
from django.urls import path,include
from . import views
urlpatterns = [
path('', views.home,name='Home'),
]
메인 URL 접속 시 home 뷰가 렌더링되도록 연결했습니다.
views.py에 아래 코드를 추가합니다.
from django.shortcuts import render
from .models import QrCode
def home(request):
if request.method=="POST":
Url=request.POST['url']
QrCode.objects.create(url=Url)
qr_code=QrCode.objects.all()
return render(request,"home.html",{'qr_code':qr_code})
POST 요청으로 전달된 URL을 받아 QrCode 모델 객체를 생성하고, 일반(GET) 요청 시에는 DB에 저장된 모든 QR 코드 목록을 템플릿에 넘겨 화면에 출력합니다.
앱 디렉터리(migration 폴더와 같은 위치)에 templates 폴더를 만들고, 그 안에 home.html 파일을 생성한 뒤 아래 내용을 작성합니다.
<!DOCTYPE html>
<html>
<head>
<title>tut</title>
</head>
<body>
<form method="POST">
{% csrf_token %}
<input type="url" placeholder="URL PLEASE" required name="url">
<button type="submit">get qrcode</button>
</form>
{% for qr in qr_code %}
<img src="{{qr.image.url}}"/><br>
{%endfor%}
</body>
</html>
사용자가 URL을 입력해 백엔드로 전송할 수 있는 입력 폼을 만들었으며, 폼 아래에서는 저장된 각 QR 코드 객체를 반복문으로 순회하며 이미지 형태로 출력합니다.
마지막으로 models.py에 다음 코드를 추가합니다.
from django.db import models
import qrcode
from PIL import Image, ImageDraw
from io import BytesIO
from django.core.files import File
import random
class QrCode(models.Model):
url=models.URLField()
image=models.ImageField(upload_to='qrcode',blank=True)
def save(self,*args,**kwargs):
qrcode_img=qrcode.make(self.url)
canvas=Image.new("RGB", (300,300),"white")
draw=ImageDraw.Draw(canvas)
canvas.paste(qrcode_img)
buffer=BytesIO()
canvas.save(buffer,"PNG")
self.image.save(f'image{random.randint(0,9999)}',File(buffer),save=False)
canvas.close()
super().save(*args,**kwargs)
여기서는 모델의 기본 save 메서드를 오버라이드하여 직접 정의했습니다. qrcode 라이브러리로 URL 기반 QR 코드를 생성한 뒤, PIL 캔버스(300×300, 흰색 배경) 위에 QR 코드를 붙여 넣습니다. 완성된 이미지는 PNG 형식으로 메모리 버퍼에 담아 media 폴더의 qrcode 경로에 저장되며, 모델 인스턴스의 image 필드에 연결됩니다. 파일명 중복을 방지하기 위해 난수를 활용한 점도 눈여겨볼 부분입니다.
이제 모든 준비가 끝났습니다. 개발 서버를 실행하고 브라우저에서 URL을 입력하면 QR 코드가 생성되는 것을 바로 확인할 수 있습니다.
출력 결과
