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實現緩存的功能。