Project/springfield 대본 다운로드
[Springfield 대본 다운로드] 3. 예외 처리하기 (flash) & 파일 압축과 다운 (zipfile, send_file)
반응형
1. Python의 alert - flash
- springfield에 존재하지 않는 스크립트를 입력한 경우, 혹은 제목을 올바르게 입력하지 않는 경우 경고문이 필요하다.
JS
의alert
와 같은 기능을Flask
에서 찾아보니flash
라는 것이 있었다.
1) app.py
import flash
app.secret_key = "abcde"
(시크릿 키를 설정해야 한다고 함)flash("에러 메시지")
from flask import Flask, render_template, request, flash
import download
# Flak 앱 서버 인스턴스
app = Flask(__name__)
app.secret_key = "abcde"
# url 패턴 - 라우팅 - 데코레이터
@app.route('/')
def index():
#get을 통해 전달받은 데이터 확인
title = request.args.get('title')
format = request.args.get('format') or "docx"
if title and format:
res = download.get_scripts(title, format)
if res.get('status') == 404:
flash("해당 대본이 존재하지 않거나, 제목이 올바르지 않습니다.")
else:
# 정상동작
return render_template('index.html')
2) index.html
body
안에 아래와 같은Jinja template
형식을 넣어 주어야 한다.
<body>
{% with messages = get_flashed_messages() %}
{% if messages %}
<script>
alert("{{messages[-1]}}")
</script>
{% endif %}
{% endwith %}
</body>
3) 결과
2. 여러 개의 파일 압축 - zipfile
static/scripts/ 하위에 저장된 여러 개의 스크립트들을 하나의 파일로 압축하기
import zipfile, os
with zipfile.ZipFile(f'static/scripts/{title}.zip', 'w') as script_zip: #zip폴더 생성
for (path, dir, files) in os.walk('static/scripts'): # 경로 탐색
for file in files: # 파일들 중
if file.endswith(f'.{format}'): # format과 일치하는 것들만 압축
script_zip.write(f'{path}/{file}', os.path.relpath(f'{path}/{file}', 'static/scripts'), compress_type = zipfile.ZIP_DEFLATED)
3. 사용자 입장에서 압축 파일 다운로드 - send_file
from flask import send_file
return send_file(f'static/scripts/{title}.zip', mimetype='zip', attachment_filename=f'static/scripts/{title}.zip', as_attachment=True)
반응형