前往
大廳
主題

【個人紀錄】Flask Blueprint與Flask-Caching的進階應用。

Treeboy | 2023-09-14 20:36:57 | 巴幣 100 | 人氣 179

前篇
【個人紀錄】Redis與快取記憶體

Blueprint(藍圖)是Flask的模組,目的是將APP拆解成獨立的路由或是視圖函數(View Function),讓APP可以更好管理,但是它本身無法直接使用Flask-Caching的功能,必須要額外設置,經過了幾天的實驗,是真的沒辦法做出來,網路上的教法幾乎都錯誤的,然後我直接跑去問YouTube上的程式設計師的解法,照著他們的說法,在stack overflow的這篇文找到適合的解答,才把這棘手的問題解決了,而且未來大型的應用程式也可以得到快取的解決方案。
※視圖函數(View Function)是指會響應網頁的路由。

結構圖
app
├──backend
│      ├──api_factory.py
│     ├──cache
│     │        └── cache.py
│     └──taiwanmap
│                └── taiwanmap.py
│                └── templates
│                                 └──index.html
├──main.py
└──requirements.txt

cache.py負責執行快取(cache)功能的程式。

from flask_caching import Cache
導入了flask_caching的Cache模組

cache = Cache(config = {  
      'CACHE_TYPE': 'redis',
      'CACHE_REDIS_HOST': *******,
      'CACHE_REDIS_PORT': *****,
      'CACHE_REDIS_PASSWORD':*********
})
cache = Cache(config={})是設定快取功的參數,
最重要的參數是CACHE_TYPE,用來表示使用哪種類型的快取,
關於參數的設置可以參考這篇


taiwanmap.py負責執行Blueprint獨立出的路由的程式,在這裡我使用了folium製作了地圖。

import folium 導入自定義地圖模組folium
from flask import Blueprint,render_template
導入藍圖與響應網頁的功能
from ..cache.cache import cache從cache程式導入cache = Cache(config={})的設定
......導入模組省略


......內部的程式省略

taiwanmap = Blueprint('taiwanmap',__name__,template_folder= 'templates')
註冊Blueprint(藍圖)與讀取templates檔案。


@taiwanmap.route("/")
註冊路由裝飾器
@cache.cached(timeout=50)
註冊快取功能裝飾器

def port_map():
    map = folium.Map(
......內部的程式省略
    )

  .....內部的程式省略

    folium.LayerControl(collapsed=False).add_to(map)
    iframe = map.get_root()._repr_html_()
    return render_template("index.html",iframe=iframe)
index.html傳遞iframe參數


index.html執行taiwanmap.py傳過來的參數。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>漁港資料</title>
</head>
<body>
    <h1>台灣漁港地圖</h1>
    <div>
        {{ iframe|safe }}接收iframe參數
    </div>

</body>
</html>



api_factory.py負責註冊後端路由與函式,這類的寫法也可以稱它為"工廠模式",
將配置與主程式分開來,方便管理不同的路由與函式。

from flask import Flask

def creat_app():
    app = Flask(__name__)

    from backend.worldmap.taiwanmap import taiwanmap
    app.register_blueprint(taiwanmap)
註冊藍圖的taiwanmap路由

    from .cache.cache import cache
    cache.init_app(app)
初始化cache,初始化之後,便會啟用cache = Cache(config={})設定

    return app


main.py是主程式,接收api_factory.py傳遞過來的註冊的資料,然後負責全部執行。

from backend.api_factory import creat_app

app = creat_app()
直接調用從api_factory傳遞過來的creat_app()函式,並存取至app變數中

if __name__ == "__main__":
    app.run()執行app程式


程式執行之後,不論重新整理幾次,都可以看見從資料庫暫存的座標資料。


以上的方法,光是一人去找資料摸索會很難找到解答,ChatGPT給的答案也都是錯的,
最後還是去找人解惑才解決問題,不過這也是學習新知識的方法。

創作回應

卡丘☆(ˊ● ω ●ˋ)★
好厲害
2023-09-14 20:40:51
Treeboy
[e6]
2023-09-14 20:53:25

更多創作