前往
大廳
主題

【個人紀錄】FastAPI與Folium

Treeboy | 2023-09-01 09:51:58 | 巴幣 100 | 人氣 167

FastAPI算蠻新的Python web framework,運行速度比Flask還快,主要歸功於整合了Starlette 與Pydantic這兩個工具的特性,除此之外,它的程式碼也易懂好寫,也和Flask一樣可以利用第三方模組來擴展功能。

●Starlette:ASGI的應用框架,它專注於異步處理,ASGI是Python web框架的標準接口,允許程式可以異步處理請求。總之,可以讓FastAPI擱置目前的請求,繞過去執行後續的請求。

●Pydantic:主要用於數據的驗證與序列化,會自動驗證數據,減少了開發者手動驗證數據。

●Folium是基於Leaflet.js的Python套件,可以自定義的互動地圖。


結構圖
app
├──static
│     └── styles.css
├──templates
│     └── index.html
├──main.py
└──requirements.txt

要使用FastAPI與Folium,需要下載uvicorn[standard]、fastapi、jinja2、Folium這四個模組。
pip install "uvicorn[standard]" ※ASGI服務器的模組
pip install fastapi
pip install jinja2 ※網頁模板
pip install folium

為了可以在其他電腦方便下載模組,要將模組放置在requirements.txt
輸入指令可以全部下載
pip install -r requirements.txt

※因為我沒有設置版本,所以會下載最新的版本,
要特定版本可以寫 "模組 == 版本",如"fastapi ==0.98.0"


main.py


設立FastAPI應用程式
app = FastAPI()

註冊靜態文件,讓程式可以從static檔案偵測到CSS檔
app.mount("/static", StaticFiles(directory="static"), name="static")

註冊Jinja2模板
templates = Jinja2Templates(directory="templates")

註冊路由app路由;response_class=HTMLResponse是用來響應HTML的語法,也可以不用設置。
@app.get("/", response_class=HTMLResponse)

建立folium地圖函式與變數,folium.Map()是用來建立地圖,包括經緯度設定(location)、地圖類型(tiles)、地圖初始大小(zoom_start)、設置控制面板(control_scale)、邊界設定(max_bounds),有蠻多功能可以設定的;request: Request也是用來響應HTML的語法。
def taiwanmap(request: Request):
    map = folium.Map(
        location=[23.97289714436863, 121.58616434318259],
        tiles="OpenStreetMap",
        zoom_start=7,
        control_scale=True,
        max_bounds=True
    )

get_root語法可以直接讀取folium,這裡是用來調整長寬。
    map.get_root().width = "1000px"
    map.get_root().height = "600px"

建立變數,包含了整個地圖的建立與生成html語法讓地圖在html上顯示。
    iframe = map.get_root()._repr_html_()

直接回傳至index.html網頁
    return templates.TemplateResponse("index.html", {"request": request,"iframe":iframe})


templates/ index.html
這一段程式碼用來讀取CSS
<link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">

接收main.py後端傳過來的地圖數據,2022年之後,要改成這種格式"{{ iframe | safe  }}"才可以讓地圖正常顯示。
<div>{{ iframe | safe  }}</div>

static/ styles.css


程式碼完成之後,
可以在cmd 或是 shell輸入uvicorn main:app --reload來執行程式
uvicorn:ASGI服務器。
main:app:main是main.py主程式的名稱,app是app = FastAPI()。
--reload:當程式碼改變的時候,會自動更新重載。

程式執行之後的樣子,挺成功的,如果要停止程式,可以輸入Ctrl+C。


明天要實作APIrouter與redis-cache功能,前者實現了大架構網站的解決方案,後者是使用redis實現緩存的功能。

創作回應

更多創作