flask file download
본문 바로가기

Backend

flask file download

 

beomi.github.io/2017/11/28/Flask-CSV-Response/

frhyme.github.io/python-libs/file_download_with_flask/

docs.python.org/3/library/io.html

 

flask에서 파일 다운받는 버튼 만들기

csv download

frhyme.github.io

 

한글이 보이는 Flask CSV Response 만들기 - Beomi's Tech blog

들어가며 웹 사이트를 만들다 보면 테이블 등을 csv파일로 다운받을 수 있도록 만들어달라는 요청이 자주 있습니다. 이번 글에서는 Flask에서 특정 URL로 들어갈 때 CSV파일을 받을 수 있도록 만들

beomi.github.io

controllers - __init__.py

from .api.down_visitors import DownVisitorsAPI

api.add_resource(DownVisitorsAPI, '/api/v2.0/down_visitors/<string:start_date>/<string:end_date>')

api 경로추가를 하면 검색창에 저렇게 입력하면 파일이 다운받아짐 예)http://localhost/api/v2.0/down_visitors/2020-04-01/2020-05-03

 

controller - api - down_visitors.py

import datetime
import json
from io import StringIO
from flask import make_response, Response
from flask_restful import Resource
from app.models.api.visitors_model import query_visitors


class DownVisitorsAPI(Resource):
	""" 방문자 목록 API 클래스. flask_restful로 __init__.py 에서 이용됨
	"""

	def get(self, start_date, end_date):
		""" 방문자 목록 API : 방문자 목록 반환

		Args:
				start_date ([string]): 검색 시작일 ; yyyy-mm-dd
				end_date ([string]): 검색 종료일 ; yyyy-mm-dd

		Returns:
				[response]: 방문자 목록 API 호출에 대한 JSON 응답 결과
		"""

		result = None
		start_day = None
		end_day = None
		# 파라미터 검사
		now = datetime.datetime.now()
		try:
			start_day = datetime.datetime.strptime(start_date, '%Y-%m-%d')
		except:
			result = {'resultCode': 400, 'resultMsg': 'bad request by start_date.'}
		if start_day != None and start_day > now:
			result = {'resultCode': 400, 'resultMsg': 'bad request by start_date..'}
		try:
			if start_day != None:
				end_day = datetime.datetime.strptime(end_date, '%Y-%m-%d')
		except:
			result = {'resultCode': 400, 'resultMsg': 'bad request by end_date.'}
		if end_day != None and end_day > now:
			result = {'resultCode': 400, 'resultMsg': 'bad request by end_date..'}
		if end_day != None and end_day < start_day:
			result = {'resultCode': 400, 'resultMsg': 'bad request by end_date...'}

		if result == None:  # start_date, end_date 파라미터에 문제가 없는가?
			result = query_visitors(start_date, end_date, 1, 19000000000)

			if result.get('resultCode') == 200:
				output = StringIO()
				output.write(u'\ufeff')  # 한글 인코딩 위해 UTF-8 with BOM 설정해주기
                
				print('헤드명1, 헤드명2, 헤드명3', file=output) #엑셀표에 표시될 헤드
                
				for row in result.get('resultData'):
					phone = row.get('phone_no')
					if phone != None and len(phone) >= 10:
						phone = phone[0:3] + '-' + phone[3:len(phone) - 4] + '-' + phone[-4:]
					print(f"{row.get('visit_datetime')}, {phone},{row.get('addr_full_name')},{row.get('is_agreement')},{row.get('is_3rd')},{row.get('is_temp')}", file=output)
				response = Response(
					output.getvalue(),
					mimetype="text/csv",
					content_type='application/octet-stream',
				)
				# 다운받았을때의 파일 이름 지정해주기
				response.headers["Content-Disposition"] = "attachment; filename=visitor_list.csv"
				return response

		response = make_response(json.dumps(result, ensure_ascii=False))
		response.headers['Content-type'] = 'application/json; charset=utf-8'

		return response

 

model - api - visitors_model.py

반응형

'Backend' 카테고리의 다른 글

flask controller - 회원가입 post, session  (0) 2021.05.09
flask db 연동(sqlite3)  (0) 2021.05.09
[flask 기초3] jinja, render_template  (0) 2021.04.29
Flask localhost 임의 IP, Port 설정  (0) 2021.04.22
flask 프로젝트생성  (0) 2021.04.20