開始 Python 之路(一)

Stephen Chen
7 min readAug 5, 2020

--

最近公司打算使用 Python 來實作 API,由於是第一次,記錄一下自己是如何學習跟開始,如果懶得看分享可以直上 Github 下載。

IDE

這是第一個會想到的問題,該用什麼 IDE?

因為有 PhpStorm 的經驗,所以就上 Jetbrains 並決定用 Pycharm。而且用 Pycharm 的好處在於,他會自動幫你偵測 Indentation 錯誤,可自動排版……etc。

其他 IDE 其實也都可以做到,不過一下載來就有不是超爽的嗎?

Indentation erro
Reformat file suggestion

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,沒包袱就是用最新的拉

在 DockerFile 中的 Tag 改用 latest,官方在寫這篇文章的時候還是 python 3.7

建議寫成 .sh 檔案,因為可以使用 Arrow up & down to navigator command 來加速開發

Build a image from Dockerfile

這邊把官方範例整合一下,把 volume binding 然後執行 start-reload.sh,由於 uvicorn-gunicorn-fastapi-docker 是基於 uvicorn-gunicorn-docker 開發的,所以在前者的源碼會看不到 start-reload.sh,是在後者的這邊。start-reload.sh 最重要的目的就是 live reload

Run docker image into container

成功會看到 Web、Swagger UI 以及 Redoc,檢查下改 code 的時候網頁上的資料是否會跟著更新

Code
Web
Redoc
Swagger

補:對 container 進行管理可透過 docker desktop

Dependencies and packages

通常 Frameworks 都一定會有套件管理工具,從文檔中得知有 PipPoetry 可以選擇,於是看了 Poetry vs Pip 之後,感想就是 Poetry All in one 的概念,所以決定使用 Poetry。

首先新增一個 pyproject.toml根據官方建議安裝 Pendulum ( Datetime )

pyproject.toml

更新 Dockerfile

Dockerfile

Rebuild image from Dockerfile,然後 import 使用

Rebuild image from Dockerfile

補:我的 IDE 一直出現紅色下底線說 No module named xxxx,求高手幫忙。

PyLint

Settle down 前面之後,再來是安裝 lint,在 Dockerfile 新增安裝 PyLint,然後 Rebuild image

補:如果 Container 有在 Running 的話記得先 Stop,Kill,Rebuild

RUN pip install PyLint

進 Container

docker exec -it isb_ugf_python38_container bash

使用

PyLint main.py

Code snippets & Live Template

Code snippets 在 Jetbrains 的生態圈裡稱 Live Template,我自己比較習慣從 Code snippets 先看語法糖有個感覺,看完會大概知道一些脈絡

這邊也推 30-seconds-of-python

Live Template in pycharm

Python Tutorial

全部弄好之後,上 W3CSchool

Trouble shooting

在 poetry 安裝套件的時候,假如出現這樣的訊息,代表我的 dataclasses-json 需要 python 3.6 以上的版本,但是我的 python 版本沒有指定,所以出錯

python version solving failed

--

--

No responses yet