Flask實(shí)現(xiàn)文件(報表)導(dǎo)出

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,
        }
)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 為了解決總是人為導(dǎo)出Excel這種繁瑣而又重復(fù)性的工作,因此應(yīng)用Flask+xlsxwriter開發(fā)了一個接...
    喜叔z閱讀 1,274評論 1 0
  • 背景 某運(yùn)維平臺有一個業(yè)務(wù)需求,需要周期性對某個導(dǎo)出的文件進(jìn)行透視分析。通過在現(xiàn)有平臺上添加上傳文件功能,服務(wù)器后...
    弓長巳寸閱讀 2,000評論 0 1
  • 為什么學(xué)習(xí)Python? 通過什么途徑學(xué)習(xí)的Python? 上網(wǎng)收集視頻,資料 關(guān)注公證號 買教程,書籍 Pyth...
    130920閱讀 1,415評論 0 0
  • 一、Flask簡介 Flask是一個基于python實(shí)現(xiàn)的web開發(fā)"微"框架。 Flask和Django一樣,也...
    仙靈兒閱讀 937評論 0 0
  • flask是python的一個web應(yīng)用框架,django很多人聽過,flask比較少見,連創(chuàng)始人一開始寫出來只是...
    思而憂閱讀 3,028評論 0 5

友情鏈接更多精彩內(nèi)容