開始 Python 之路(一)
最近公司打算使用 Python 來實作 API,由於是第一次,記錄一下自己是如何學習跟開始,如果懶得看分享可以直上 Github 下載。
Frameworks
剛開始學一定先使用 Framework 了呀,然後自己再選 Frameworks 的時候會注意幾點
1. 社群維護度 & 符合當前需求
找 Frameworks 第一件做的事情就是上 Github 搜尋,依造 Most stars 排序一個一個膜拜一下,知道哪幾個有名的,關注 commit、issue、intro 跟 doc….etc。
接著 Google 關鍵字 Python framework comparison 來取得各種 pros & cons。這邊推 Source 1 跟 Source 2。快速心得就是大致上分成以下三種 Full-stack framework ( 齊全 )、Micro framework ( 輕量 ) 以及 Asynchronous framework ( 專注處理大量 concurrent connections )。細節推薦去看一下 Source。
2. License
License 就不多描敘拉,因為我也是透過下方這張圖來初略判斷的。
3. 好不好找到人接手
人力網站 104、meet.jobs、Python Facebook …. etc。
綜合上方幾點打算使用 Asynchronous frameworks。並採用 2019 年才出來的 FastAPI。
環境
講到環境馬上聯想到 Docker,基於決定了 FastAPI 之後,立馬 FastAPI + Docker Google 找到了 uvicorn-gunicorn-fastapi-docker (以下簡稱 ugfd) 。看完整個教學介紹之後,我認識幾個新技術 & 名詞。
Gunicorn 就是 Python Web Server Gateway Interface (WSGI) HTTP server.
Uvicorn is a lightning-fast ASGI server
Build docker
在當下寫文章這時間,ugfd 最新的 tag 已經開放支援到 python3.8,沒包袱就是用最新的拉
建議寫成 .sh 檔案,因為可以使用 Arrow up & down to navigator command 來加速開發
這邊把官方範例整合一下,把 volume binding 然後執行 start-reload.sh,由於 uvicorn-gunicorn-fastapi-docker 是基於 uvicorn-gunicorn-docker 開發的,所以在前者的源碼會看不到 start-reload.sh,是在後者的這邊。start-reload.sh 最重要的目的就是 live reload
成功會看到 Web、Swagger UI 以及 Redoc,檢查下改 code 的時候網頁上的資料是否會跟著更新
補:對 container 進行管理可透過 docker desktop
Dependencies and packages
通常 Frameworks 都一定會有套件管理工具,從文檔中得知有 Pip 跟 Poetry 可以選擇,於是看了 Poetry vs Pip 之後,感想就是 Poetry 是 All in one 的概念,所以決定使用 Poetry。
首先新增一個 pyproject.toml,根據官方建議安裝 Pendulum ( Datetime )
更新 Dockerfile
Rebuild image from Dockerfile,然後 import 使用
補:我的 IDE 一直出現紅色下底線說 No module named xxxx,求高手幫忙。
PyLint
Settle down 前面之後,再來是安裝 lint,在 Dockerfile 新增安裝 PyLint,然後 Rebuild image
補:如果 Container 有在 Running 的話記得先 Stop,Kill,Rebuild
進 Container
docker exec -it isb_ugf_python38_container bash
使用
Code snippets & Live Template
Code snippets 在 Jetbrains 的生態圈裡稱 Live Template,我自己比較習慣從 Code snippets 先看語法糖有個感覺,看完會大概知道一些脈絡
這邊也推 30-seconds-of-python
Python Tutorial
全部弄好之後,上 W3CSchool
Trouble shooting
在 poetry 安裝套件的時候,假如出現這樣的訊息,代表我的 dataclasses-json 需要 python 3.6 以上的版本,但是我的 python 版本沒有指定,所以出錯