前篇
【個人紀錄】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給的答案也都是錯的,
最後還是去找人解惑才解決問題,不過這也是學習新知識的方法。