티스토리 뷰

서론

데이터를 수집하고 수집한 데이터를 활용해야 할 때, 수집된 데이터를 전달하는 방법으로 가장 보편적인 것은 CSV파일이 아닐까 생각합니다. 특히나 AI분야에서는 데이터를 CSV파일 형태로 많이 저장하기 때문에 중요합니다. 그래서 Django 프로젝트에서 CSV파일을 전달하는 방법을 소개합니다.

본론

관련 지식

HttpResponse

Django에서 Http요청에 대한 응답을 나타내는 객체입니다. 해당 객체에 대한 자세한 설명은 공식문서에 잘 정리되어 있으니 필요하면 찾아보면 좋을 것 같습니다.
우리가 주목해야 하는 부분은 headers의 Content-TypeContent-Disposition입니다.

Content-Type

Content-Type은 Http 요청에 따른 응답으로 전달받는 데이터의 타입을 나타내는 헤더 정보입니다.
우리가 일반적으로 웹사이트에 접속하면 처음으로 받게되는 파일 또한 Content-Type이 text/html으로 설정되어 있습니다.


javascript, css 또한 Content-Type이 별도로 설정되어 있습니다.

Content-Disposition

Content-Disposition는 내용이 브라우저 내에서 직접 보여지는 것인지 아니면 첨부파일로서 다운로드되어 로컬에 저장되는 것인지를 나타내는 헤더 정보입니다.
브라우저에서 파일을 다운로드 받게 하기 위해서는 Content-Dispostion에 attachment; filename="filename.jpg"과 같은 부분을 추가해야 합니다.

구현

뷰(View)에서 HttpResponse의 headers에 Content-Type과 Content-Disposition을 설정해주면 됩니다.

그리고 csv 패키지를 이용해 csv 데이터를 작성해 준 후 HttpResponse 객체를 반환하면 됩니다.


# FBV
def someView(request):
    response = HttpResponse(headers={
        'Content-Type':'text/csv',
        'Content-Disposition': 'attachment; filename="data.csv"'
        }
    )

    writer = csv.writer(response)
    writer.writerow(['column_name1', 'column_name2', 'column_name3', ...])

    objects = SomeModel.objects.all()

    for obj in objects:
        writer.writerow([obj.column1, obj.column2, obj.column3, ...])

    return response

클래스 기반 뷰에서도 같은 형식으로 작성하면 됩니다.
이제 해당 뷰를 URL과 연결해주면 파일 형식으로 데이터를 전달할 수 있게 됩니다.

HTML에서

저는 a태그를 이용해 이를 구현해 보았습니다.

<a href="{% url 'accounts:csvDownload' userInfo.pk %}" class="btn btn-secondary">CSV로 저장</a>

실제로 버튼을 누르면 csv파일을 브라우저가 다운로드 받는 것을 알 수 있습니다.

결론

헤더 정보를 수정하면 csv파일 뿐만 아니라 스프레드시트 형식이나 기타 형식 등으로도 데이터 전달이 가능하기 때문에 파일을 다운로드 하는 다른 기능에서도 유사하게 적용할 수 있습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함