본문 바로가기

문돌이 존버/Django 스터디

장고(Django), 다양한 응답의 함수 기반 뷰(2)

반응형
본 글은 Holix의 "리액트와 함께 장고 시작하기 Complete" 강의를 듣고 작성한 일지입니다.

이번에는 장고 views.py 에서 Excel 파일 다운로드 응답을 각각 다른 방식으로 처리하는 예시를 살펴보겠습니다.

# 파일 읽기
from django.http import HttpResponseBadRequest
from urllib.parse import quote

def response_excel(request):
    filepath = '/other/path/excel.xls'
    filename = os.path.basename(filepath)

    with open(filepath, 'rb') as f:
        response = HttpResponse(f, content_type='application/vnd.ms-excel')

        # 브라우저에 따라 다른 처리 필요
        encoded_filename = quote(filename)
        response['Content-Disposition'] = "attachment; filename*=utf-8''{}".format(encoded_filename)
    return response
# 판다스 활용 - csv파일
import pandas as pd
from io import StringIO
from urllib.parse import quote
from django.http import HttpResponse

def response_csv(request):
    df = pd.DataFrame([
        [100, 110, 120],
        [200, 210, 220],
        [300, 310, 320]
    ])

    io = StringIO() # 메모리 기반의 파일 인터페이스
    df.to_csv(io)
    io.seek(0) # 끝에 있는 file cursor를 처음으로 이동

    encoded_filename = quote('pandas.csv')
    response = HttpResponse(io, content_type='text/csv')
    response['Content-Disposition'] = "attachment; filename*=utf-8''{}".format(encoded_filename)
    return response
# 판다스 활용 - excel파일
import pandas as pd
from io import BytesIO
from urllib.parse import quote
from django.http import HttpResponse

def response_excel(request):
    df = pd.DataFrame([
        [100, 110, 120],
        [200, 210, 220]
    ])

    io = BytesIO() # 메모리 기반의 파일 인터페이스
    df.to_excel(io)
    io.seek(0) # 끝에 있는 file cursor를 처음으로 이동

    encoded_filename = quote('pandas.xlsx')
    response = HttpResponse(io, content_type='application/vnd.ms-excel')
    response['Content-Disposition'] = "attachment; filename*=utf-8''{}".format(encoded_filename)
    return response

이번에는 이미지 응답을 생성하는 예시를 살펴볼 것인데요. 우선 장고가 아닌 파이썬에서 처리하는 Pillow를 통한 이미지 응답 생성입니다.

import requests
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont

# 맑은고딕 폰트 경로
ttf_path = 'C:/Windows/Fonts/malgun.ttf' # 맥은 애플고딕 경로: '/Library/Fonts/AppleGothic.ttf'
image_url = '~~/.jpg'

res = requests.get(image_url) # 서버로 HTTP GET 요청하여 응답 획득
io = BytesIO(res.content) # 응답의 Raw Body 메모리 파일 객체 BytesIO 인스턴스 생성
io.seek(0)

canvas = Image.open(io).convert('RGBA')
font = ImageFont.truetype(ttf_path, 40)
draw = ImageDraw.Draw(canvas)

text = 'Data Scientist'
left, top = 10, 10
margin = 10
width, height = font.getsize(text)
right = left + width + margin
bottom = top + height + margin

draw.rectangle((left, top, right, bottom), (225, 225, 224))
draw.text((15, 15), text, font=font, fill=(20, 20, 20))

canvas.show()

위의 코드를 장고 views.py 에서 처리하려면 기본적인 내용은 동일하되 장고 형식에 맞게 조금만 변경해주면 됩니다.

import requests
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont

def response_pillow_image(request):
	# 위 코드와 동일
    
    response = HttpResponse(content_type='image/png')
    canvas.save(response, format='PNG') # HttpResponse의 file-like 특성 활용
    return response
728x90
반응형