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
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 |