以 Flask 建立符合 REST 風格的 API 伺服器應用程式。
證書,內容源自於 Udemy 的 "REST APIs with Flask and Python" 線上課程。
- 初探 Flask 網頁框架,以 decorator 設定網頁應用程式的 route。
- 了解 GET, POST, PUT, DELETE 等常見的 HTTP 請求方法。
- 了解 200, 201, 202, 401, 404 等常見的 HTTP 狀態碼。
- 了解 RESTful API 設計需聚焦在「資源」(resource) 並且符合無狀態的(stateless)特性。
- 實作 RESTful API 伺服器應用程式。
- 以 Postman 應用程式進行 API 測試。
- 以
Flask-RESTful
實作 RESTful API 伺服器應用程式。 - 以
Flask-JWT
實作 JSON Web Token (JWT) 使用者驗證機制。 - 使用
RequestParser
解析使用者輸入的 JSON 資料。
- 導入
sqlite3
,改為從資料庫存取使用者和商品資訊。 - 實作使用者註冊機制。
- 導入
Flask-SQLAlchemy
,以 ORM 機制操作資料庫。 - 加入商店資訊,與商品為一對多的關聯關係。
將 Flask 應用程式部署在 Heroku 上,並使用 Heroku 提供的 PostgresSQL,步驟:
- 在本機端增修專案內容,如加入
Procfile
,runtime.txt
,uwsgi.ini
等,接著commit
並push
至 GitHub 上的指定 repo。 - 在 Heroku 官方網站註冊帳號,接著創建一個應用程式並與 GitHub 指定 repo 連線,再來加入 buildpack
heroku/python
和 add-onsHeroku Postgres
。 - 在本機端安裝 Heroku CLI(參考這裡)並透過
heroku login
指令登入 Heroku。 - 在本機端透過
heroku git:remote -a <app-name>
指令,加入 Heroku 遠端節點。 - 在本機端透過
git subtree push --prefix basics/section8 heroku master
指令,將當前專案內容的子目錄push
至 Heroku 的遠端節點並部署上線。
測試:
連線至這裡,取得資料庫當中所有的商店及其商品,以 JSON
格式回傳。
將 Flask 應用程式部署在 DigitalOcean 提供的 Droplet 虛擬主機上,步驟:
- 註冊 DigitalOcean 帳號並創建個 Droplet 虛擬主機,作業系統為 Ubuntu 16.04,接著設定 SSH 連線,在本機端使用 PuTTY 以 SSH 連線至遠端虛擬主機。
- 在作業系統當中創建一個新的使用者。
- 安裝並設定 PostgreSQL 資料庫,包括在 PostgreSQL 當中創建新使用者以及資料庫,並設定相關權限。
- 安裝並設定 Nginx 伺服器,包括防火牆設定、錯誤頁面、uwsgi 參數等。
- 設定 Python 虛擬環境,接著安裝專案所需套件,並把專案內容從 GitHub
clone
下來。 - 設定個 Ubuntu 服務,用來開啟 uwsgi 伺服器,負責執行我們的 Flask 應用程式,包括日誌檔儲存目錄、跑幾個程序、幾個執行緒等。
測試:
連線至這裡(創建日期 2020/05/30),取得資料庫當中所有的商店及其商品,以 JSON
格式回傳。
- 註冊域名、設定 DNS 伺服器。
- 取得 SSL 數位憑證,以 https 通訊協定連線,設置 Nginx。
- 實作 token-refreshing 機制,提升用戶瀏覽體驗,不需要定期重新輸入帳號密碼,同時設定重要操作時仍需重新登入,提升安全性(使用
@jwt_refresh_token_required
,create_refresh_token()
,create_access_token()
等)。 - 針對各個權限的請求,如訪客、一般使用者、管理員,回應相對應的資料(使用
@jwt.user_claims_loader
,@jwt_optional
,get_jwt_claims()
等)。 - 針對各個權限錯誤的請求,回傳相對應的錯誤訊息(使用
@jwt.expired_token_loader
,@jwt.invalid_token_loader
,@jwt.needs_fresh_token_loader
等)。 - 以黑名單(blacklist)設定,實作登出機制(使用
@jwt.token_in_blacklist_loader
,get_raw_jwt()
等)。
證書,內容源自於 Udemy "Advanced REST APIs with Flask and Python" 線上課程。
為了接下來的課程內容,做了幾項事情準備:
- 簡化驗證機制。
- 加入 type hinting。
- 統一程式碼風格。
- 所有
Resource
的方法統一改為類別方法(使用@classmethod
)。
導入 marshmallow
, flask-marshmallow
和 marshmallow-sqlalchemy
:
- 透過定義好每個
Resource
的Schema
,簡化「請求解析」、「創建Model
物件」、「回傳 JSON」的過程。
- 實作使用者電子信箱認證流程(使用 Mailgun 服務)。
- 在專案中使用
.env
檔案儲存敏感資料。 - 在
Flask-RESTful
框架中回傳.html
檔案(使用make_response()
和render_template()
)。
優化使用者電子信箱認證流程:
- 有效認證期限、重傳認證信。
- 專案程式架構優化(抽出
confirmation
功能作為「資源」看待)。
- 以更安全的方式配置應用程式(使用
from_object()
和from_envvar()
等)。 - 瞭解
WSGI
,uwsgi
,uWSGI
,Werkzeug
之間的關係。 - 導入
Flask-Uploads
,實作圖片、大頭貼上傳、下載、刪除等功能(使用UploadSet
,FileStorage
等)。
- 導入
Flask-Migrate
,對資料庫進行版本控制,新增、刪除、修改其細節。 - 常見指令如
flask db init
,flask db upgrade
,flask db downgrade
等。
- 了解 OAuth 第三方登入的流程(以 GitHub 為例),包括了認證和授權,取得
access_token
等。 - 導入
Flask-OAuthlib
。 - 使用
Flask
的g
來儲存access_token
。 - 允許使用第三方登入的使用者設定密碼。
- 介接
Stripe
第三方支付系統。 - 增加「訂單」資源,以
Flask-SQLAlhemy
實作多對多關聯。