FastAPI 接口開發提示詞(Pydantic 模型校驗、依賴注入、統一錯誤返回、自動化測試一次生成)

用 FastAPI 寫後端接口時用:描述資源和業務規則,得到分層清晰的接口代碼,包括請求與響應模型、參數校驗、鑑權依賴、數據庫會話管理、統一錯誤格式,以及覆蓋正常與異常場景的測試。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名熟悉 FastAPI 和 Pydantic v2 的 Python 後端工程師。請根據下面的需求生成接口代碼。

- 資源與需求:[資源與需求](例:商品評價:用戶可創建、查看列表、刪除自己的評價)
- 業務規則:[業務規則](例:每個訂單隻能評價一次,評分 1 到 5,內容 500 字以內)
- 數據庫與 ORM:[數據庫與 ORM](例:PostgreSQL + SQLAlchemy 2.0 異步)
- 鑑權方式:[鑑權方式](例:Bearer Token,已有獲取當前用戶的函數)
- 項目現有結構(如果有):
  [目錄結構或現有代碼]

生成要求:
1. 分層:路由只負責接收請求和返回響應,業務邏輯放在服務層,數據訪問放在倉儲層或直接用 ORM 會話(按項目現有風格)。
2. 模型:請求模型和響應模型分開定義,不要直接返回 ORM 對象;用 Pydantic 的字段約束表達業務規則(長度、範圍、格式);響應中不包含敏感字段。
3. 依賴注入:數據庫會話、當前用戶通過依賴獲取;會話的生命週期(打開、提交、回滾、關閉)要正確。
4. 錯誤處理:業務錯誤使用統一的錯誤結構和合適的狀態碼(404 不存在、403 無權限、409 重複評價、422 參數錯誤);不要把數據庫異常的原文返回給客戶端。
5. 列表接口:分頁參數有上限,避免一次查詢過多數據;說明排序方式。
6. 權限:刪除時校驗是否為本人的評價,防止越權。
7. 測試:用 pytest 和測試客戶端寫測試,覆蓋正常創建、參數校驗失敗、重複評價、刪除他人評價、未登入訪問;測試使用獨立的測試數據庫或依賴覆蓋。
8. 用異步還是同步:根據我的數據庫驅動選擇,並說明在異步路由中調用同步阻塞代碼的問題。

輸出:文件結構、各文件代碼(中文註釋)、運行與測試命令。依賴庫的版本差異(如 Pydantic v1 與 v2 寫法不同)要按 v2 寫,並在用到 v2 特有寫法時註明。

高亮處換成你自己的內容:[資源與需求]、[業務規則]、[數據庫與 ORM]、[鑑權方式]、[目錄結構或現有代碼]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[業務規則] 寫得越具體,Pydantic 模型的字段約束就越完整,這些約束會自動變成接口文檔和 422 校驗。[項目現有結構] 有的話一定要貼,AI 會沿用你的分層方式和命名風格,而不是另起一套。

常見坑:

  • 在 async 定義的路由裏調用同步的數據庫驅動或耗時的同步函數,會阻塞整個事件循環,並發一上來接口就變慢。要麼全用異步驅動,要麼用普通函數定義路由。
  • 直接返回 ORM 對象,可能把密碼哈希這類字段帶出去。響應模型要單獨定義。
  • 網上很多示例還是 Pydantic v1 的寫法(如舊的配置類、校驗器裝飾器),和 v2 不兼容,複製時要注意。

追問技巧:追問「為這些接口補充 OpenAPI 文檔中的示例和錯誤響應說明」,或「把刪除改成軟刪除,需要改哪些地方」。

示例輸出

示例,僅供參考(節選)
python
from pydantic import BaseModel, Field

class ReviewCreate(BaseModel):
    order_id: int
    rating: int = Field(ge=1, le=5)
    content: str = Field(min_length=1, max_length=500)

class ReviewOut(BaseModel):
    id: int
    rating: int
    content: str
    model_config = {"from_attributes": True}   # v2 寫法:允許從 ORM 對象讀取

@router.post("/reviews", response_model=ReviewOut, status_code=201)
async def create_review(body: ReviewCreate, user=Depends(get_current_user),
                        db: AsyncSession = Depends(get_db)):
    if await review_service.exists(db, body.order_id):
        raise HTTPException(status_code=409, detail={"code": "REVIEW_EXISTS", "message": "該訂單已評價"})
    return await review_service.create(db, user.id, body)

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~