인공지능, 머신러닝/Django + DataScience

[Django prac][weather graph] 4. View에서 Template으로 이미지 전달하기

bay07 2024. 4. 5. 17:27

▷ View에서 Template으로 이미지 전달하기

View에서 Template으로 이미지 형식의 데이터를 직접 전달할 수 없다. 

그래서 저장된 이미지의 경로를 전달하여

Template에서 출력해야한다. 

지금은 matplotlib 그래프를 이미지의 형식으로 버퍼에 저장한 후

그 지정된 경로를 전달할 것이다. 

 

* 버퍼 (buffer)

데이터를 임시로 저장하는 공간 


# myapps > vies.py 

from django.shortcuts import render
import matplotlib.pyplot as plt
import pandas as pd

# io : 입출력 연산을 위한 Python 표준 라이브러리
# BytesIO : 이진 데이터를 다루기 위한 버퍼를 제공
from io import BytesIO

# 텍스트 <-> 이진 데이터를 변환할 수 있는 모듈
import base64


def index(request):
    x = [1, 2, 3, 4]
    y = [2, 4, 6, 8]

    plt.plot(x, y)
    plt.title("test graph")
    plt.xlabel('x label')
    plt.ylabel('y label')


    buffer = BytesIO()
    # buffer 에 그래프를 png 형태로 저장 
    plt.savefig(buffer, format='png')

    # 버퍼의 내용을 인코딩
    img_base64 = base64.b64encode(buffer.getvalue()).decode('utf-8').replace('\n', '')

    # 터미널에서 디버깅을 위해선 print 도 가능
    # print(img_base64)

    buffer.close()

    # ----- csv 파일 읽어오기
    csv_path = 'austin_weather.csv'
    df = pd.read_csv(csv_path)

    context = {
        # 이미지 경로
        # 'img_base64': img_base64,
        'image': f'data:image/png;base64, {img_base64}',
        'df': df,
    }

    return render(request, "index.html", context)