---
# System prepended metadata

title: FastAPI 筆記

---

# FastAPI 筆記




# 開場
- 簡單自介
- 動機
- 文章大綱
    - 先介紹基礎的使用 (6)
        - 第一支程式
            - 會提到 lifespan
            - 會提到 logger
        - 建立 API
            - 路由、參數、動態路由
            - 這邊以 GET POST 為主做 Demo 就好
        - 設計 API
            - RESTful API
            - HTTP method
        - form file
        - API 管理
            - add router
            - API 版本
            - 文件
            - depends
        - API 文件設定
    - 再介紹進階的設定 (5)
        - Response
            - JSON
            - File, Stream
            - Redirect
        - Response 2
            - HTML
            - Jinjia
        - 簡單 Demo 一個前端
            - mount
            - favicon
        - Middleware + CORS
            - CORS 簡介
            - middleware
        - 環境變數
            - pydantic
    - 接著開始舉例說明各種應用與使用情境 (11)
        - 登入驗證 (basic auth)
        - 登入驗證 (JWT)
            - 簡介 JWT
            - raise HTTPException
            - 再度提到 depends
            - 再度提到 環境變數
        - 資料庫 (ORM)
            - 簡介 ORM
            - SQL injection
            - SQLAlchemy
        - 資料庫 Demo
            - SQLite
            - Models (schema?)
            - 建立
            - CRUD
        - 資料庫維護
            - Alembic
            - 預設資料
        - 資料庫連線注意事項
            - 何時建立 session
            - pool
            - yeild
        - 錯誤處理
            - 分類
            - 再度提一下 logger
        - 錯誤處理 (middleare)
            - 再探 middleware、HTTPException
            - 自訂義 Exception
        - Log
            - Log 設定 (存在本地、terminal print 出來)
            - Loguru
        - 用 loguru 客製化 log 內容
            - 如何客製化內容
        - 用 traceback 取得更多錯誤資訊

    - 最後放些擺不進去的
        - async await
        - background task
        - web socket
        - health check
    - 神奇技巧們 (使用到的機率不高)
        - sub API
        - lifespan
        - 
- 期許

筆記
希望對即將入門的人有幫助
或是裡面提到的特殊情境 (也是實際工作上遇到的)
熟練的人也可以給意見

> 以某個主題貫穿全文? 時事?

# 第一支程式

# API 基本介紹
路由、參數、動態路由
RESTful API
form file
# API addrouters
> API 越來越多
tag prefix
/api/v1 檔案架構
簡單提一下 swagger 文件 (但要 demo)
depends injection (可以加在 function 或 router)
(舉例用驗證 header)

# API 文件
介紹 swagger
summary description
參數 schema


# 更大的架構
- 不同版本
- 多個文件
> subAPI?

# Response
JSON File Redirect

# Response 2
HTML
Jinjia

# 前端
HTML CSS javascript
favicon

# async await
# JWT Token
jwt.io
官網範例
(提一下環境變數，之後再討論)

# JWT Token 2
第二次 depends
# websocket
# 環境變數
app.config
.env .toml

# CORS
# 資料庫
## ORM簡介 SQLAlchemy
## Models + CRUD
## 範例程式

# 資料庫進階 ?
什麼時候建立 session ?
pool ?
Sesssion yeild Depends


# 錯誤處理
## 錯誤處理分類
錯誤處理可以分為兩大類，一種是可預期的錯誤，另一種是不可預期的錯誤
(舉例)
而這些錯誤，都應該要有對應的處理方式，包含回傳對應的錯誤訊息，並且被記錄下來，
方便之後回頭檢查問題來源，

## 可預期錯誤
## Python try except + raise

## log
前面提到，這些錯誤都應該被記錄下來，此時就會使用 Log 系統
簡介預設的 Log
從 Request 拿更多資料

## 不可預期的錯誤
系統預設是回傳 500
用醜陋的寫法整個包起來
# 再探錯誤處理 (middleware)
## middleware 簡介
## 在 middleware 處理錯誤 + log
## HTTPException
HTTP status code
## 自訂義 HTTPException


# Loguru
## 簡單回顧
## Loguru vs. logger
## 設定
> 用 loguru 客製化 log 內容
> 用 traceback 取得更多錯誤資訊


# 測試
## 測試簡介
單元測試
E2E
## pytest + client

# CI/CD
## github actions
環境變數 secrets

# 部屬
## Docker
## 免費平台

## uvicorn + worker ? 

# 其他 (尚未整理)
## background task
## 定期任務