Flask提供了send_file函數(shù)用來導(dǎo)出文件,以下用實(shí)例來說明
- 路由文件views.py
# 直接調(diào)用該接口即可導(dǎo)出文件
@con.route("/exportExcel", methods=["GET", "POST"])
def export_excel_inter():
"""導(dǎo)出excel報表"""
return export_excel()
- 實(shí)現(xiàn)
import time
from io import BytesIO
from flask import send_file
from openpyxl import Workbook
from loguru import logger
def export_excel():
"""excel 報表導(dǎo)出"""
wb = Workbook()
sheet = wb.create_sheet("報表")
# excel數(shù)據(jù)處理并設(shè)置樣式
excel_data_deal(sheet)
# 使用字節(jié)流存儲
output = BytesIO()
# 保存文件
wb.save(output)
# 文件seek位置,從頭(0)開始
output.seek(0)
filename = "%s.xls" % str(int(time.time()))
# 打印文件大小
logger.info("{} -> {} b".format(filename, len(output.getvalue())))
# as_attachment:是否在headers中添加Content-Disposition
# attachment_filename:下載時使用的文件名
# conditional: 是否支持?jǐn)帱c(diǎn)續(xù)傳
fv = send_file(output, as_attachment=True, attachment_filename=filename, conditional=True)
fv.headers['Content-Disposition'] += "; filename*=utf-8''{}".format(filename)
fv.headers["Cache-Control"] = "no_store"
fv.headers["max-age"] = 1
logger.info("導(dǎo)出報表---------%s" % filename)
return fv
- 注意事項
'''這里創(chuàng)建文件使用openpyxl而不是xlwt,主要是xlwt支持上傳的文件有大小限制,超過會報如下錯誤'''
File "/usr/local/lib/python3.8/site-packages/xlwt/UnicodeUtils.py", line 55, in upack2
raise Exception('String longer than 32767 characters')
Exception: String longer than 32767 characters
'''Flask靜態(tài)文件默認(rèn)緩存時間為12小時,為了每次導(dǎo)出的文件不是之前緩存的文件,建議清除緩存,如下設(shè)置'''
from datetime import timedelta
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = timedelta(seconds=1) # 靜態(tài)文件緩存為1s
# Flask默認(rèn)配置源碼
default_config = ImmutableDict(
{
"ENV": None,
"DEBUG": None,
"TESTING": False,
"PROPAGATE_EXCEPTIONS": None,
"PRESERVE_CONTEXT_ON_EXCEPTION": None,
"SECRET_KEY": None,
"PERMANENT_SESSION_LIFETIME": timedelta(days=31),
"USE_X_SENDFILE": False,
"SERVER_NAME": None,
"APPLICATION_ROOT": "/",
"SESSION_COOKIE_NAME": "session",
"SESSION_COOKIE_DOMAIN": None,
"SESSION_COOKIE_PATH": None,
"SESSION_COOKIE_HTTPONLY": True,
"SESSION_COOKIE_SECURE": False,
"SESSION_COOKIE_SAMESITE": None,
"SESSION_REFRESH_EACH_REQUEST": True,
"MAX_CONTENT_LENGTH": None,
"SEND_FILE_MAX_AGE_DEFAULT": timedelta(hours=12), # 靜態(tài)文件默認(rèn)緩存時間
"TRAP_BAD_REQUEST_ERRORS": None,
"TRAP_HTTP_EXCEPTIONS": False,
"EXPLAIN_TEMPLATE_LOADING": False,
"PREFERRED_URL_SCHEME": "http",
"JSON_AS_ASCII": True,
"JSON_SORT_KEYS": True,
"JSONIFY_PRETTYPRINT_REGULAR": False,
"JSONIFY_MIMETYPE": "application/json",
"TEMPLATES_AUTO_RELOAD": None,
"MAX_COOKIE_SIZE": 4093,
}
)