FastAPI 響應狀態碼:管理和自定義 HTTP Status Code

FastAPI 響應狀態碼:管理和自定義 HTTP Status Code

本文介紹了如何在 FastAPI 中聲明、使用和修改 HTTP 狀態碼,涵蓋了常見的 HTTP 狀態碼分類,如信息響應(1xx)、成功狀態(2xx)、客戶端錯誤(4xx)和服務器錯誤(5xx)。通過 status_code 參數和 fastapi.status 常量簡化開發,并提供了如何根據業務需求動態調整狀態碼的方法。此外,還介紹了如何通過 Response 參數在路徑操作函數內部修改響應狀態碼,以實現更精確的控制和更好的客戶端交互體驗。

文章目錄

  • FastAPI 響應狀態碼:管理和自定義 HTTP Status Code
      • 一 聲明 HTTP 狀態碼
      • 二 HTTP 協議狀態碼
      • 三 使用 `fastapi.status` 中的變量
      • 四 使用 `Response` 參數更改狀態碼
      • 五 完整代碼示例
      • 六 源碼地址
      • 七 參考

在 FastAPI 中,正確設置和管理 HTTP 狀態碼對于API的準確性和響應性至關重要。

一 聲明 HTTP 狀態碼

from fastapi import FastAPI, statusapp = FastAPI()@app.post("/items/", status_code=201)
async def create_item(name: str):return {"name": name}

status_code 參數屬于裝飾器中的參數,而非 路徑操作函數 的參數。它接收一個表示 HTTP 狀態碼的數字,或支持 IntEnum 類型,例如 Python 的 http.HTTPStatus。運行代碼文件 chapter17.py 來啟動應用:

$ uvicorn chapter17:app --reload

在 SwaggerUI 中可以查看在線文檔:http://127.0.0.1:8000/docs 。在文檔中會code會有顯示:
在這里插入圖片描述

二 HTTP 協議狀態碼

在 HTTP 協議中,狀態碼是響應的一部分,通常由三位數字組成,并有便于識別的名稱,但關鍵仍是數字。常用狀態碼如下:

  • 1xx(信息):返回信息,通常不包含響應體,使用較少。

  • 2xx

    (成功):表示請求成功,是最常用的狀態碼。

    • 200:成功,默認狀態碼,表示一切正常。
    • 201:已創建,通常在創建新資源時使用。
    • 204:無內容,表示沒有響應體。
  • 3xx

    (重定向):表示重定向請求,響應不一定包含內容。

    • 304:未修改,表示資源未改變,不返回響應體。
  • 4xx

    (客戶端錯誤):表示請求有誤。

    • 400:一般客戶端錯誤。
    • 404:未找到資源。
  • 5xx(服務器錯誤):表示服務器問題,通常由服務器或應用錯誤引發,極少直接使用。

詳解見 Web HTTP Status 。

在這里插入圖片描述

在開發應用軟件時,有時會自定義非標準響應碼,這些響應碼與標準的 HTTP 響應碼不同。

三 使用 fastapi.status 中的變量

@app.post("/items01/", status_code=status.HTTP_201_CREATED)
async def create_item(name: str):return {"name": name}

可以使用 fastapi.status 中預定義的變量,或通過 from starlette import status 導入。為了簡化開發,FastAPI 提供了與 starlette.status 相同的 fastapi.status,該變量直接來源于 Starlette。以下是已定義的 HTTP status code 變量:

HTTP_100_CONTINUE = 100
HTTP_101_SWITCHING_PROTOCOLS = 101
HTTP_102_PROCESSING = 102
HTTP_103_EARLY_HINTS = 103
HTTP_200_OK = 200
HTTP_201_CREATED = 201
HTTP_202_ACCEPTED = 202
HTTP_203_NON_AUTHORITATIVE_INFORMATION = 203
HTTP_204_NO_CONTENT = 204
HTTP_205_RESET_CONTENT = 205
HTTP_206_PARTIAL_CONTENT = 206
HTTP_207_MULTI_STATUS = 207
HTTP_208_ALREADY_REPORTED = 208
HTTP_226_IM_USED = 226
HTTP_300_MULTIPLE_CHOICES = 300
HTTP_301_MOVED_PERMANENTLY = 301
HTTP_302_FOUND = 302
HTTP_303_SEE_OTHER = 303
HTTP_304_NOT_MODIFIED = 304
HTTP_305_USE_PROXY = 305
HTTP_306_RESERVED = 306
HTTP_307_TEMPORARY_REDIRECT = 307
HTTP_308_PERMANENT_REDIRECT = 308
HTTP_400_BAD_REQUEST = 400
HTTP_401_UNAUTHORIZED = 401
HTTP_402_PAYMENT_REQUIRED = 402
HTTP_403_FORBIDDEN = 403
HTTP_404_NOT_FOUND = 404
HTTP_405_METHOD_NOT_ALLOWED = 405
HTTP_406_NOT_ACCEPTABLE = 406
HTTP_407_PROXY_AUTHENTICATION_REQUIRED = 407
HTTP_408_REQUEST_TIMEOUT = 408
HTTP_409_CONFLICT = 409
HTTP_410_GONE = 410
HTTP_411_LENGTH_REQUIRED = 411
HTTP_412_PRECONDITION_FAILED = 412
HTTP_413_REQUEST_ENTITY_TOO_LARGE = 413
HTTP_414_REQUEST_URI_TOO_LONG = 414
HTTP_415_UNSUPPORTED_MEDIA_TYPE = 415
HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE = 416
HTTP_417_EXPECTATION_FAILED = 417
HTTP_418_IM_A_TEAPOT = 418
HTTP_421_MISDIRECTED_REQUEST = 421
HTTP_422_UNPROCESSABLE_ENTITY = 422
HTTP_423_LOCKED = 423
HTTP_424_FAILED_DEPENDENCY = 424
HTTP_425_TOO_EARLY = 425
HTTP_426_UPGRADE_REQUIRED = 426
HTTP_428_PRECONDITION_REQUIRED = 428
HTTP_429_TOO_MANY_REQUESTS = 429
HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE = 431
HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS = 451
HTTP_500_INTERNAL_SERVER_ERROR = 500
HTTP_501_NOT_IMPLEMENTED = 501
HTTP_502_BAD_GATEWAY = 502
HTTP_503_SERVICE_UNAVAILABLE = 503
HTTP_504_GATEWAY_TIMEOUT = 504
HTTP_505_HTTP_VERSION_NOT_SUPPORTED = 505
HTTP_506_VARIANT_ALSO_NEGOTIATES = 506
HTTP_507_INSUFFICIENT_STORAGE = 507
HTTP_508_LOOP_DETECTED = 508
HTTP_510_NOT_EXTENDED = 510
HTTP_511_NETWORK_AUTHENTICATION_REQUIRED = 511

四 使用 Response 參數更改狀態碼

@app.put("/get-or-create-task/{task_id}", status_code=200)
def get_or_create_task(task_id: str, response: Response):if task_id not in tasks:tasks[task_id] = "This didn't exist before"response.status_code = status.HTTP_201_CREATEDreturn tasks[task_id]

路徑操作函數中聲明一個 Response 類型的參數,根據業務邏輯修改狀態碼 response.status_code = status.HTTP_201_CREATED

五 完整代碼示例

from fastapi import FastAPI, status, Responseapp = FastAPI()@app.post("/items/", status_code=201)
async def create_item(name: str):return {"name": name}@app.post("/items01/", status_code=status.HTTP_201_CREATED)
async def create_item(name: str):return {"name": name}tasks = {"foo": "Listen to the Bar Fighters"}@app.put("/get-or-create-task/{task_id}", status_code=200)
def get_or_create_task(task_id: str, response: Response):if task_id not in tasks:tasks[task_id] = "This didn't exist before"response.status_code = status.HTTP_201_CREATEDreturn tasks[task_id]

六 源碼地址

詳情見:GitHub FastApiProj

七 參考

[1] FastAPI 文檔

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

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

相關文章

力扣題庫-擲骰子模擬詳細解析

題目如下: 有一個骰子模擬器會每次投擲的時候生成一個 1 到 6 的隨機數。 不過我們在使用它時有個約束,就是使得投擲骰子時,連續 擲出數字 i 的次數不能超過 rollMax[i](i 從 1 開始編號)。 現在,給你一…

深入淺出:PHP中的數據類型全解析

文章目錄 引言理解數據類型標量類型整數 (integer)浮點數 (float)布爾值 (boolean)字符串 (string) 復合類型數組 (array)對象 (object)資源 (resource)NULL 特殊類型Callable強制類型轉換 實戰案例總結與展望參考資料 引言 在編程的世界里,數據類型是構建任何應用…

當linux可執行文件缺少或者不兼容so庫時候,如何查看版本以及缺少那些庫

解決方法: ldd 命令來驗證程序是否加載了正確的庫: 如檢查linear_elasticity可執行文件缺少的庫,用下面命令: ldd linear_elasticity 可以發現下面not found就是缺少的庫,還有對應的庫的位置已經版本 $ ldd lin…

第P1周:Pytorch實現mnist手寫數字識別

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 目標 1. 實現pytorch環境配置 2. 實現mnist手寫數字識別 3. 自己寫幾個數字識別試試具體實現 (一)環境 語言環境:Python…

Seq2Seq模型的發展歷史;深層RNN結構為什么出現梯度消失/爆炸問題,Transformer為什么不會;Seq2Seq模型存在問題

目錄 Seq2Seq模型的發展歷史 改進不足的地方 深層RNN結構為什么出現梯度消失/爆炸問題,Transformer為什么不會 深層RNN結構為什么出現梯度消失/爆炸問題: Transformer為什么不會出現梯度消失/爆炸問題: Seq2Seq模型存在問題 T5模型介紹 Seq2Seq模型的發展歷史 序列到…

網絡安全技術詳解:虛擬專用網絡(VPN) 安全信息與事件管理(SIEM)

虛擬專用網絡(VPN)詳細介紹 虛擬專用網絡(VPN)通過在公共網絡上創建加密連接來保護數據傳輸的安全性和隱私性。 工作原理 VPN的工作原理涉及建立安全隧道和數據加密: 隧道協議:使用協議如PPTP、L2TP/IP…

Hive 窗口函數與分析函數深度解析:開啟大數據分析的新維度

Hive 窗口函數與分析函數深度解析:開啟大數據分析的新維度 在當今大數據蓬勃發展的時代,Hive 作為一款強大的數據倉庫工具,其窗口函數和分析函數猶如一把把精巧的手術刀,助力數據分析師們精準地剖析海量數據,挖掘出深…

SCAU期末筆記 - 數據庫系統概念

我校使用Database System Concepts,9-12章不考所以跳過,因為課都逃了所以復習很倉促,只準備過一下每一章最后的概念辨析,我也不知道有沒有用 第1章 引言 數據庫管理系統(DBMS) 由一個互相關聯的數據的集合…

Android 12系統源碼_窗口管理(九)深淺主題切換流程源碼分析

前言 上一篇我們簡單介紹了應用的窗口屬性WindowConfiguration這個類,該類存儲了當前窗口的顯示區域、屏幕的旋轉方向、窗口模式等參數,當設備屏幕發生旋轉的時候就是通過該類將具體的旋轉數據傳遞給應用的、而應用在加載資源文件的時候也會結合該類的A…

河南省的教育部科技查新工作站有哪些?

鄭州大學圖書館(Z12):2007年1月被批準設立“教育部綜合類科技查新工作站”,同年12月被河南省科技廳認定為河南省省級科技查新機構。主要面向河南省的高校、科研機構、企業提供科技查新、查收查引等服務。 河南大學圖書館&#xf…

Leetcode經典題6--買賣股票的最佳時機

買賣股票的最佳時機 題目描述: 給定一個數組 prices ,它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。 你只能選擇 某一天 買入這只股票,并選擇在 未來的某一個不同的日子 賣出該股票。設計一個算法來計算你所能獲取的最大利潤。…

MCPTT 與BTC

MCPTT(Mission Critical Push-to-Talk)和B-TrunC(寬帶集群)是兩種關鍵通信標準,它們分別由不同的組織制定和推廣。 MCPTT(Mission Critical Push-to-Talk)標準由3GPP(第三代合作伙伴…

去除賬號密碼自動賦值時的輸入框背景色

問題描述: 前端使用賬號密碼登錄,若在網頁保存過當前頁面的密碼和賬號,那么當再次進入該頁面,網頁會自動的把賬號和密碼賦到輸入框中,而此時輸入框是帶有背景色的,與周邊的白色背景顯得很不協調&#xff1…

【Pytorch】torch.reshape與torch.Tensor.reshape區別

問題引入: 在Pytorch文檔中,有torch.reshape與torch.Tensor.reshape兩個reshape操作,他們的區別是什么呢? 我們先來看一下官方文檔的定義: torch.reshape: torch.Tensor.reshape: 解釋: 在p…

掃碼與短信驗證碼登錄JS逆向分析與Python純算法還原

文章目錄 1. 寫在前面2. 掃碼接口分析2. 短信接口分析3. 加密算法還原【??作者主頁】:吳秋霖 【??作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致力于Python與爬蟲領域研究與開發工作!…

spring6:3容器:IoC

spring6:3容器:IoC 目錄 spring6:3容器:IoC3、容器:IoC3.1、IoC容器3.1.1、控制反轉(IoC)3.1.2、依賴注入3.1.3、IoC容器在Spring的實現 3.2、基于XML管理Bean3.2.1、搭建子模塊spring6-ioc-xml…

【認證法規】安全隔離變壓器

文章目錄 定義反激電源變壓器 定義 安全隔離變壓器(safety isolating transformer),通過至少相當于雙重絕緣或加強絕緣的絕緣使輸入繞組與輸出繞組在電氣上分開的變壓器。這種變壓器是為以安全特低電壓向配電電路、電器或其它設備供電而設計…

車機端同步outlook日歷

最近在開發一個車機上的日歷助手,其中一個需求就是要實現手機端日歷和車機端日歷數據的同步。然而這種需求似乎沒辦法實現,畢竟手機日歷是手機廠商自己帶的系統應用,根本不能和車機端實現數據同步的。 那么只能去其他公共的平臺尋求一些機會&…

OpenCV-圖像閾值

簡單閾值法 此方法是直截了當的。如果像素值大于閾值,則會被賦為一個值(可能為白色),否則會賦為另一個值(可能為黑色)。使用的函數是 cv.threshold。第一個參數是源圖像,它應該是灰度圖像。第二…

力扣300.最長遞增子序列

題目描述 題目鏈接300. 最長遞增子序列 給你一個整數數組 nums ,找到其中最長嚴格遞增子序列的長度。 子序列 是由數組派生而來的序列,刪除(或不刪除)數組中的元素而不改變其余元素的順序。例如,[3,6,2,7] 是數組 […