본문 바로가기

Project/springfield 대본 다운로드

[Springfield 대본 다운로드] 3. 예외 처리하기 (flash) & 파일 압축과 다운 (zipfile, send_file)

반응형

1. Python의 alert - flash

  • springfield에 존재하지 않는 스크립트를 입력한 경우, 혹은 제목을 올바르게 입력하지 않는 경우 경고문이 필요하다.
  • JSalert와 같은 기능을 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) 결과

alert 결과

 

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)

사용자 pc에 저장 가능

반응형