FastAPI入門:多個文件、后臺任務、元數據和文檔 URL

更大的應用 - 多個文件

假設文件結構如下:
在這里插入圖片描述

.
├── app                  # 「app」是一個 Python 包
│   ├── __init__.py      # 這個文件使「app」成為一個 Python 包
│   ├── main.py          # 「main」模塊,例如 import app.main
│   ├── dependencies.py  # 「dependencies」模塊,例如 import app.dependencies
│   └── routers          # 「routers」是一個「Python 子包」
│   │   ├── __init__.py  # 使「routers」成為一個「Python 子包」
│   │   ├── items.py     # 「items」子模塊,例如 import app.routers.items
│   │   └── users.py     # 「users」子模塊,例如 import app.routers.users
│   └── internal         # 「internal」是一個「Python 子包」
│       ├── __init__.py  # 使「internal」成為一個「Python 子包」
│       └── admin.py     # 「admin」子模塊,例如 import app.internal.admin

APIRouter

假設專門用于處理用戶邏輯的文件是位于 /app/routers/users.py 的子模塊

你可以使用 APIRouter 為該模塊創建路徑操作。

然后你可以使用它來聲明路徑操作。

from fastapi import APIRouterrouter = APIRouter()@router.get("/users")
async def read_users():return [{"username": "Rick"}, {"username": "Morty"}]@router.get("/users/me", tags=["users"])
async def read_user_me():return {"username": "fakecurrentuser"}@router.get("/users/{username}", tags=["users"])
async def read_user(username: str):return {"username": username}

依賴項

我們將需要一些在應用程序的好幾個地方所使用的依賴項。因此,我們將它們放在它們自己的 dependencies 模塊(app/dependencies.py)中

from fastapi import Header, HTTPExceptionasync def get_token_header(x_token: str = Header()):if x_token != "fake-super-secret-token":raise HTTPException(status_code=400, detail="X-Token header invalid")async def get_query_token(token: str):if token != "jessica":raise HTTPException(status_code=400, detail="No Jessica token provided")

其他使用 APIRouter 的模塊

假設你在位于 app/routers/items.py 的模塊中還有專門用于處理應用程序中「item」的端點。

我們知道此模塊中的所有路徑操作都有相同的:

  • 路徑 prefix:/items。
  • tags:(僅有一個 items 標簽)。
  • 額外的 responses。
  • dependencies:它們都需要我們創建的 X-Token 依賴項。

因此,我們可以將其添加到 APIRouter 中,而不是將其添加到每個路徑操作中

我們還可以添加一個 tags 列表和額外的 responses 列表,這些參數將應用于此路由器中包含的所有路徑操作。

我們可以添加一個 dependencies 列表,這些依賴項將被添加到路由器中的所有路徑操作中,并將針對向它們發起的每個請求執行/解決。

我們仍然可以添加更多將會應用于特定的路徑操作的 tags,以及一些特定于該路徑操作的額外 responses

from fastapi import APIRouter, Depends, HTTPExceptionfrom ..dependencies import get_token_headerrouter = APIRouter(prefix="/items",tags=["items"],dependencies=[Depends(get_token_header)],responses={404: {"description": "Not found"}}, # 當 API 端點可能返回 404 錯誤時,在文檔中顯示 "Not found" 的描述
)fake_items_db = {"plumbus": {"name": "Plumbus"}, "gun": {"name": "Portal Gun"}}@router.get("/")
async def read_items():return fake_items_db@router.get("/{item_id}")
async def read_item(item_id: str):if item_id not in fake_items_db:raise HTTPException(status_code=404, detail="Item not found")return {"name": fake_items_db[item_id]["name"], "item_id": item_id}@router.put("/{item_id}", tags=["custom"], responses={403: {"description": "Operation forbidden"}})
async def update_item(item_id: str):if item_id != "plumbus":raise HTTPException(status_code=403, detail="You can only update the plumbus")return {"item_id": item_id, "name": "The Great Plumbus"}

FastAPI 主體

from fastapi import Depends, FastAPIfrom .dependencies import get_query_token, get_token_header
from .routers import items, users
from .internal import adminapp = FastAPI(dependencies=[Depends(get_query_token)]) # 聲明全局依賴# 加入路由
app.include_router(users.router)
app.include_router(items.router)
app.include_router(admin.router,prefix="/admin",tags=["admin"],dependencies=[Depends(get_token_header)],responses={418: {"description": "I'm a teapot"}},  # 示例響應
)@app.get("/")
async def root():return {"message": "Hello World"}

假設你的組織為你提供了 app/internal/admin.py 文件。

它包含一個帶有一些由你的組織在多個項目之間共享的管理員路徑操作的 APIRouter。

對于此示例,它將非常簡單。但是假設由于它是與組織中的其他項目所共享的,因此我們無法對其進行修改,以及直接在 APIRouter 中添加 prefix、dependencies、tags 等

可是我們仍然希望在包含 APIRouter 時設置一個自定義的 prefix,以便其所有路徑操作以 /admin 開頭,我們希望使用本項目已經有的 dependencies 保護它,并且我們希望它包含自定義的 tags 和 responses。

我們可以通過將這些參數傳遞給 app.include_router() 來完成所有的聲明,而不必修改原始的 APIRouter

查看自動化的 API 文檔

現在,使用 app.main 模塊和 app 變量運行 uvicorn
在這里插入圖片描述

后臺任務

你可以定義在返回響應后運行的后臺任務。

這對需要在請求之后執行的操作很有用,但客戶端不必在接收響應之前等待操作完成。

使用 BackgroundTasks

創建要作為后臺任務運行的函數。

它只是一個可以接收參數的標準函數。

它可以是 async def 或普通的 def 函數,FastAPI 知道如何正確處理。

然后在你的 路徑操作函數 里,用 .add_task() 方法將任務函數傳到 后臺任務 對象中

from email import message
from fastapi import BackgroundTasks, FastAPIapp = FastAPI()def write_notification(email: str, message = ""):with open("log.txt", mode="w") as email_file:content = f"notification for {email} with message: {message}\n" email_file.write(content)@app.post("/send-notification/{email}")
async def send_notification(email: str, background_tasks: BackgroundTasks):background_tasks.add_task(write_notification,email, message="some notification")return {"message": "Notification sent in the background"}

依賴注入

使用 BackgroundTasks 也適用于依賴注入系統,你可以在多個級別聲明 BackgroundTasks 類型的參數:在 路徑操作函數 里,在依賴中(可依賴),在子依賴中,等等。

from tkinter import NO
from typing import Annotatedfrom fastapi import BackgroundTasks, Depends, FastAPIapp = FastAPI()def write_log(message: str):with open("log.txt", mode="a") as log:log.write(message)def get_query(background_tasks: BackgroundTasks, q: str | None = None):if q:message = f"found query: {q}\n"background_tasks.add_task(write_log, message)return q@app.post("/send-notification/{email}")
async def send_notification(email: str, background_tasks: BackgroundTasks, q: Annotated[str, Depends(get_query)]
):message = f"message to {email}\n"background_tasks.add_task(write_log, message)return {"message": "Message sent"}

運行程序,此時設置q為3
在這里插入圖片描述

元數據和文檔 URL

API 元數據

你可以在設置 OpenAPI 規范和自動 API 文檔 UI 中使用的以下字段:
在這里插入圖片描述

from fastapi import FastAPIdescription = """
ChimichangApp API helps you do awesome stuff. 🚀## ItemsYou can **read items**.## UsersYou will be able to:* **Create users** (_not implemented_).
* **Read users** (_not implemented_).
"""app = FastAPI(title="ChimichangApp API",description=description,summary="Deadpool's favorite app. Nuff said.",version="0.0.1",terms_of_service="http://example.com/terms/",contact={"name": "Deadpoolio the Amazing","url": "http://x-force.example.com/contact/","email": "dp@x-force.example.com",},license_info={"name": "Apache 2.0","url": "https://www.apache.org/licenses/LICENSE-2.0.html",},
)@app.get("/items/")
async def read_items():return [{"name": "Katana"}]

運行程序,查看API文檔
在這里插入圖片描述

標簽元數據

創建標簽元數據并把它傳遞給 openapi_tags 參數,將 tags 參數和路徑操作(以及 APIRouter)一起使用,將其分配給不同的標簽:

from fastapi import FastAPItags_metadata = [{"name": "users","description": "Operations with users. The **login** logic is also here.",},{"name": "items","description": "Manage items. So _fancy_ they have their own docs.","externalDocs": {"description": "Items external docs","url": "https://fastapi.tiangolo.com/",},},
]app = FastAPI(openapi_tags=tags_metadata)@app.get("/users/", tags=["users"])
async def get_users():return [{"name": "Harry"}, {"name": "Ron"}]@app.get("/items/", tags=["items"])
async def get_items():return [{"name": "wand"}, {"name": "flying broom"}]

運行程序,打開docs文檔
在這里插入圖片描述
每個標簽元數據字典的順序也定義了在文檔用戶界面顯示的順序。

例如按照字母順序,即使 users 排在 items 之后,它也會顯示在前面,因為我們將它的元數據添加為列表內的第一個字典。

文檔 URLs

你可以配置兩個文檔用戶界面,包括:

  • Swagger UI:服務于 /docs。
    • 可以使用參數 docs_url 設置它的 URL。
    • 可以通過設置 docs_url=None 禁用它。
  • ReDoc:服務于 /redoc。
    • 可以使用參數 redoc_url 設置它的 URL。
    • 可以通過設置 redoc_url=None 禁用它。
from fastapi import FastAPIapp = FastAPI(docs_url="/documentation", redoc_url=None)@app.get("/items/")
async def read_items():return [{"name": "Foo"}]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917880.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917880.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一個示例mcp agent功能的交互式框架

https://github.com/whym3/Deepseek_MCPDeepseek_MCP https://github.com/whym3/Deepseek_MCP Deepseek_MCP是一個演示mcp agent的框架,基于Flask開發,支持在瀏覽器采用交互方式與deepseek及agent對話。需要注冊外部Deepseek api,不支持本地…

nodejs 基礎知識-2

模塊的暴露和導入 編寫date.js module.exports.echo 導出的名稱 module.exports.echo function echo(){ return Date.now(); } 編寫 index.js const echoDate require(‘./date.js’) 在index引入 console.log(echoDate.echo()); //調用 開發一個自定義模塊 exports.forma…

遞歸推理樹(RR-Tree)系統:構建認知推理的骨架結構

探索基于三維評估的動態推理系統如何實現智能決策與知識演化引言 在復雜問題求解領域(如戰略決策或科學探索),人類思維的遞歸本質為AI系統設計提供了重要啟發。我設計并實現的遞歸推理樹(Recursive Reasoning Tree, RR-Tree&#…

《動手學深度學習》讀書筆記—9.5機器翻譯與數據集

本文記錄了自己在閱讀《動手學深度學習》時的一些思考,僅用來作為作者本人的學習筆記,不存在商業用途。 語言模型是自然語言處理的關鍵, 而機器翻譯是語言模型最成功的基準測試。 因為機器翻譯正是將輸入序列轉換成輸出序列的 序列轉換模型&a…

Mysql進行操作時鎖的具體行為

場景一:單個事務更新一條存在的數據 假設有表 user (id PK, name, age),數據:[id1, nameAlice, age25] 你的 SQL: UPDATE user SET age 26 WHERE id 1; 底層動作: 事務 A (主動方) 發起更新請求。Lock Manager 介入&…

人工智能領域、圖歐科技、IMYAI智能助手2025年7月更新月報

IMYAI 平臺 2025 年 7 月重要功能更新與優化匯總 2025年07月31日更新 細節優化: 修復了移動端提交后自動彈出側邊欄的BUG。優化對話高級配置界面,增加滾動條并固定高度,避免內容超出屏幕。音樂生成界面的人聲選擇新增“合唱”選項&#xff…

HTTP 與 HTTPS 的區別深度解析:從原理到實踐

HTTP 和 HTTPS 是現代 Web 開發中不可或缺的協議,它們決定了瀏覽器與服務器之間數據傳輸的方式。HTTPS 作為 HTTP 的安全版本,在安全性、性能和用戶體驗上都有顯著提升。本文將通過萬字篇幅,結合圖表和代碼示例,詳細剖析 HTTP 與 …

STM32F407VET6學習筆記11:smallmodbus_(多從機)創建新的slave從機

今日記錄一些smallmodbus 創建新的slave 從機 的過程,以及使用的關鍵點. 目錄 創建新的從機對應操作函數與buffer 創建新的從機線程與操作代碼: slave使用的要點: 完整的slave代碼: 能正常通信: 創建新的從機對應操作函…

【論文閱讀】Transformer Feed-Forward Layers Are Key-Value Memories

Transformer Feed-Forward Layers Are Key-Value Memories 原文摘要 研究背景與問題: 前饋層占Transformer模型參數總量的2/3,但其功能機制尚未得到充分研究 核心發現:提出前饋層實質上是鍵值存儲系統 鍵:這里的鍵與訓練數據中出…

昇思+昇騰開發板:DeepSeek-R1-Distill-Qwen-1.5B 模型推理部署與 JIT 優化實踐

目錄 引言 模型推理部署 環境準備 安裝 MindSpore 查看當前 mindspore 版本 安裝 MindNLP 模型與分詞器加載 導入必要的庫 加載分詞器 加載模型 對話功能實現 設置系統提示詞 構建對話歷史輸入 推理函數實現 交互界面實現 推理JIT優化 基礎環境安裝 JIT 優化配置…

用phpstudy安裝php8.2后報錯:意思是找不到php_redis.dll拓展時

1.地址:https://pecl.php.net/package/redis/6.2.0/windows 2.下載3.解壓后復制php_redis.dll到phpstudy_pro\Extensions\php\php8.2.9nts\ext目錄 4.打開php.ini,加上 extension_dir “D:\software\phpstudy_pro\Extensions\php\php8.2.9nts\ext”

開源列式分布式數據庫clickhouse

這里寫自定義目錄標題開源列式OLAP數據庫clickhouseclickhouse使用 ClickHouse 的場景如何理解行式存儲和列式存儲clickhouse-go開源列式OLAP數據庫clickhouse OLAP (分析型):專為快速掃描、聚合、分析海量數據設計。OLTP (事務型):專為處理大量短事務&…

Java Stream API 詳解(Java 8+)

1. Stream 操作分類Stream 操作分為兩類:中間操作(Intermediate Operations)返回新的 Stream,可以鏈式調用(如 filter, map, sorted, distinct)。惰性求值:只有遇到終止操作時才會執行。終止操作…

「源力覺醒 創作者計劃」_文心大模型4.5系列開源模型, 從一行代碼到一個生態:聊聊開源戰略那些事兒,順便扯扯文心大模型 4.5 的使用心得

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏關注哦 💕 目錄從一行…

算法專題(二)回文鏈表

1、源代碼class Solution {public boolean isPalindrome(ListNode head) {ListNode fasthead,slowhead; //快慢指針都在頭結點//快指針走2步,慢指針走一步。//雙數快指針最后是null,單數快指針下一位是nullwhile(fast!null && fast.next!null){f…

2025《艾諾提亞失落之歌》逆向工程解包嘗試

前言 想開發一下光明之魂,看能不能解包《艾諾提亞失落之歌》的模型。 之前寫了(https://blog.csdn.net/weixin_42875245/article/details/148616547?spm1001.2014.3001.5501) 沿用這個思路進行逆向工程解包。 文章目錄請添加圖片描述前言…

JVM 03 類加載機制

JVM 將字節碼二進制流加載到內存稱為類加載。 什么時候加載類 new 實例化對象。而對象所屬類還沒被加載。讀取/設置類的靜態非常量字段,常量字段在常量池。調用類的靜態方法。類初始化,優先初始化父類。虛擬機啟動時,先加載用戶指定的主類。 …

STM32H7+FreeRTOS+LwIP移植EtherCAT開源主站SOEM

代碼下載什么的就不多說了,直接看需要移植修改的代碼。 1、osal.c修改 /******************************************************************************* * *** **** *** *** …

VijosOJ:中文信息學競賽的二十年開源之路

VijosOJ:中文信息學競賽領域的老牌開源在線判題系統 在中文編程教育與信息學競賽的發展歷程中,在線判題系統(OJ)扮演了至關重要的角色。它們不僅是選手訓練的 “戰場”,更是知識傳遞與社區交流的樞紐。VijosOJ&#x…

QPainter::CompositionMode解析

基本概念目標(Destination):已經存在的像素。源(Source):要繪制的新像素。組合模式:決定源和目標如何混合。總結SourceOver:源繪制在目標之上。DestinationOver:目標繪制在源之上。Clear:二者重疊區域被清空…