成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于 oracle 的 flask 項(xiàng)目(五)——報(bào)表下載

klinson / 1133人閱讀

摘要:將報(bào)表下載下來(lái),然后能稍許進(jìn)行修飾,這是必須的。項(xiàng)目描述將頁(yè)面原始呈現(xiàn)的數(shù)據(jù)及搜索后的數(shù)據(jù)以報(bào)表的形式下載下來(lái)。至此,你可以實(shí)驗(yàn)一下,你的項(xiàng)目是否可以實(shí)現(xiàn)報(bào)表下載了。

在國(guó)企,很多領(lǐng)導(dǎo)是按部就班的晉升上來(lái)的,他們的年齡及經(jīng)歷使他們至今還沒(méi)有掌握電腦的基礎(chǔ)知識(shí),因此,紙質(zhì)報(bào)表是他們掌握全局的依據(jù),必備的工具。將報(bào)表下載下來(lái),然后能稍許進(jìn)行修飾,這是必須的。
項(xiàng)目描述

將頁(yè)面原始呈現(xiàn)的數(shù)據(jù)及搜索后的數(shù)據(jù)以 excel 報(bào)表的形式下載下來(lái)。

知識(shí)難點(diǎn)

單一的 url 頁(yè)面中會(huì)呈現(xiàn)出不同的數(shù)據(jù),需要能夠把不同的數(shù)據(jù)下載下來(lái),只需要用到 ajax 的知識(shí),在同一個(gè)頁(yè)面中以 json 的形式傳遞數(shù)據(jù)。

實(shí)現(xiàn)頁(yè)面模板

不再贅述,僅僅是在頁(yè)面上加載一個(gè)下載按鈕,詳情看源碼。

實(shí)現(xiàn)下載功能的試圖函數(shù)

views.py 的內(nèi)容如下:

...
...
import os
from collections import OrderedDict
from config import basedir
from pyexcel_xls import save_data, get_data
...
...



@show.route("/", methods=["GET", "POST"])
def download_xls(filename):
    data = OrderedDict()
    data_path = os.path.join(excel_path, filename)

    num = 0
    if "01.xls" in filename:
        header_data = ["序號(hào)", "部門(mén)", "角色", "員工", "電話", "客戶", "月份",
                       "本月資產(chǎn)余額    ", "上月資產(chǎn)余額", "新增余額"]
        body_data = [header_data]
        for t in json.loads(request.get_data()):
            num += 1
            body_data.append([num, t["department"], t["role"], t["staff_name"], t["phone"], t["guest_name"],
                              t["month"], t["balance"], t["last_balance"],
                              float("%.2f" % t["balance"]) - float("%.2f" % t["last_balance"])])
        data.update({"01報(bào)表": body_data})

    if "02.xls" in filename:
        header_data = ["序號(hào)", "部門(mén)", "角色", "員工", "電話", "月份", "管戶數(shù)"
                       "本月資產(chǎn)余額    ", "上月資產(chǎn)余額", "新增余額"]
        body_data = [header_data]
        for t in json.loads(request.get_data()):
            num += 1
            body_data.append([num, t["department"], t["role"], t["staff_name"], t["staff_phone"],
                              t["month"], t["balance"], t["last_balance"],
                              float("%.2f" % t["balance"]) - float("%.2f" % t["last_balance"])])
        data.update({"02報(bào)表": body_data})
    save_data(data_path, data)
    return jsonify({"data": "ok"})

很明顯,通過(guò) return 返回的 jsonify 數(shù)據(jù),大家應(yīng)該知道,我這是要用 json 了。

而其中的兩個(gè) filename 的判斷,我是因?yàn)橐鰞蓚€(gè)頁(yè)面的下載鏈接,所以對(duì) filename 進(jìn)行了一個(gè)判斷。

代碼中使用了 collections 的有序字典 OrderedDict, pyexcel_xls的相關(guān)模塊,同時(shí)也設(shè)置了要生成的 xls 文件的生成路徑及文件名——data_path = os.path.join(excel_path, filename)。

實(shí)現(xiàn) ajax 功能

既然是 ajax 那就是 javascript 咯,還得返回 html 模板。在 flask 項(xiàng)目中,模板的變量都是封裝在 jinja2 中,我們寫(xiě) javascript 的時(shí)候,不能多帶帶再建立一個(gè) js 文件,導(dǎo)入到模板中,因?yàn)椋瑹o(wú)法獲得 Jinja2 變量。還得直接在 html 中寫(xiě) javasript。

01.html 中實(shí)現(xiàn) ajax 下載
{% block js %}
    {{ super() }} 
    
{% endblock %}

詳情請(qǐng)看注釋。

02.html 中實(shí)現(xiàn) ajax 下載

不在贅述,基本上是和 02.html 頁(yè)面一樣。

至此,你可以實(shí)驗(yàn)一下,你的項(xiàng)目是否可以實(shí)現(xiàn)報(bào)表下載了。

很不幸,我們忘了一個(gè)重要的事情,那就是 js 中 database 是繼承自 jinja2 變量,它是否是你所想的那種 json 數(shù)據(jù)呢。答案是否定的。結(jié)果是這樣的:

那么我們需要繼續(xù)工作咯。

使 sqlalchemy 數(shù)據(jù) json 化

models.py 中建立一個(gè)類:

class AlchemyJsonEncoder(json.JSONEncoder):
    def default(self, obj):
        # 判斷是否是Query
        if isinstance(obj, Query):
            # 定義一個(gè)字典數(shù)組
            fields = []
            # 檢索結(jié)果集的行記錄
            for rec in obj:
                # 定義一個(gè)字典對(duì)象
                record = {}
                # 檢索記錄中的成員
                for field in [x for x in dir(rec) if
                              # 過(guò)濾屬性
                              not x.startswith("_")
                              # 過(guò)濾掉方法屬性
                              and hasattr(rec.__getattribute__(x), "__call__") == False
                              # 過(guò)濾掉不需要的屬性
                              and x != "metadata"]:
                    try:
                        record[field] = rec.__getattribute__(field)
                    except TypeError:
                        record[field] = None
                fields.append(record)
            # 返回字典數(shù)組
            return fields
        # 其他類型的數(shù)據(jù)按照默認(rèn)的方式序列化成JSON
        return json.JSONEncoder.default(self, obj)

詳細(xì)功能請(qǐng)看注釋。

在 01 , 02 兩個(gè) url 鏈接的試圖函數(shù)中,加入如下內(nèi)容:

views.py 中增加

return render_template("show/01.html", data=data, searchForm=search_form, database=json.dumps(database, cls=AlchemyJsonEncoder))

此時(shí),在查看我們要傳輸?shù)?json 數(shù)據(jù):

至此,你可以使用下載功能了,不管你的頁(yè)面中的數(shù)據(jù)如何變化,你下載的報(bào)表都會(huì)顯示你當(dāng)前頁(yè)面的數(shù)據(jù)。

源碼下載

提示: 讓這么多的數(shù)據(jù)在頁(yè)面中使用明文傳輸,是一種極其不安全的行為,這是網(wǎng)絡(luò)爬蟲(chóng)的肥沃礦場(chǎng)。當(dāng)然,如果你使用的環(huán)境是我這樣的內(nèi)部 web 環(huán)境,那就另當(dāng)別論。不過(guò)如果你有更好的解決方法,那么可以告訴我,不勝感激。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41307.html

相關(guān)文章

  • 基于 oracle flask 項(xiàng)目(一)——配置項(xiàng)目

    摘要:一般印象,項(xiàng)目適合做一些短小精悍的項(xiàng)目,特別是與等數(shù)據(jù)庫(kù)結(jié)合很是般配。生成報(bào)表,不同的查詢結(jié)果生成不同的報(bào)表。配置從下載客戶端,然后解壓后放入自己指定的目錄。指定數(shù)據(jù)庫(kù)連接池的超時(shí)時(shí)間。 一般印象,flask 項(xiàng)目適合做一些短小精悍的項(xiàng)目,特別是與 sqlite、mysql 等數(shù)據(jù)庫(kù)結(jié)合很是般配。但是在一些大公司,特別是一些金融行業(yè)等國(guó)企公司,還是以 oracle 居多,那么,這個(gè)小辣...

    xialong 評(píng)論0 收藏0
  • 基于 oracle flask 項(xiàng)目(三)——生成報(bào)表

    摘要:本文主要講解如何生成不同需求的報(bào)表。項(xiàng)目描述第一個(gè)頁(yè)面,以和為關(guān)聯(lián),查詢出本月職工的關(guān)聯(lián)客戶及客戶的資產(chǎn)余額。建立上個(gè)月的虛字段。,二是利用函數(shù)來(lái)對(duì)初始化數(shù)據(jù)進(jìn)行賦值的操作。提示注意的語(yǔ)法。權(quán)限為的用戶只顯示本人的相關(guān)信息。 曾經(jīng),因?yàn)閷?duì) sqlalchemy 不熟悉,固執(zhí)的拋棄之,直接引入原生的 cx_Oracle 來(lái)生成報(bào)表,但是經(jīng)過(guò)一堆的上下文等錯(cuò)誤后,我幡然悔悟,還是回到了 s...

    sixgo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<