FAST API部署和使用

第一部分:FastAPI 的使用(開發環境)

1. 安裝

首先,你需要安裝 FastAPI 和一個 ASGI 服務器,最常用的是 Uvicorn。

pip install "fastapi[standard]"

這個命令會安裝 FastAPI 以及所有推薦的依賴,包括 Uvicorn(用于服務器)、Pydantic(用于數據模型)等。

2. 創建一個簡單的應用

創建一個名為 main.py 的文件:

# main.py
from fastapi import FastAPI# 創建 FastAPI 應用實例
app = FastAPI()# 定義根路徑的 GET 請求處理程序
@app.get("/")
async def read_root():return {"message": "Hello, World!"}# 定義一個帶路徑參數的 GET 請求處理程序
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):return {"item_id": item_id, "q": q}
3. 運行開發服務器

使用 Uvicorn 在本地運行你的應用:

uvicorn main:app --reload
  • main:app: main 是你的模塊文件名(不含 .py),app 是你在代碼中創建的 FastAPI() 實例的名稱。
  • --reload: 讓服務器在代碼更改后自動重啟。僅在開發時使用此選項

輸出會顯示服務器運行地址,通常是 http://127.0.0.1:8000

4. 交互式 API 文檔

FastAPI 最強大的特性之一就是自動生成交互式 API 文檔。啟動服務器后,你可以訪問:

  • Swagger UI 文檔: http://127.0.0.1:8000/docs
    • 這是一個交互式界面,你可以直接看到所有端點,并嘗試調用它們。
  • ReDoc 文檔: http://127.0.0.1:8000/redoc
    • 這是一個更漂亮的、基于靜態頁面的文檔。
5. 測試 API

你可以使用 curl、httpie 或任何 API 客戶端(如 Postman, Insomnia)來測試你的 API。

# 測試根路徑
curl http://localhost:8000# 測試帶參數的路徑
curl "http://localhost:8000/items/5?q=somequery"

第二部分:FastAPI 的部署(生產環境)

重要提示:千萬不要在生產環境中使用 --reload 選項。

生產環境部署有多種方式,以下是幾種最常見和推薦的方法。

方式 1: 使用 Uvicorn 直接運行(簡單部署)

對于小型應用或初期部署,你可以直接運行 Uvicorn,但需要調整一些參數以獲得更好的性能。

uvicorn main:app --host 0.0.0.0 --port 80 --workers 4
  • --host 0.0.0.0: 讓服務器監聽所有公共 IP,而不僅僅是本地回環地址 (127.0.0.1)。
  • --port 80: 使用標準的 HTTP 端口 80。
  • --workers 4: 啟動多個工作進程(worker processes)。數量通常設置為 CPU 核心數 * 2 + 1。這利用了多進程模式,大大提高了并發能力。

優點:簡單快捷。
缺點:缺乏高級功能,如 graceful shutdown、更復雜的負載均衡等。通常用于過渡或簡單場景。

方式 2: 使用 Gunicorn 作為進程管理器(推薦)

Uvicorn 提供了一個 Worker 類,可以與 Gunicorn 這樣的成熟進程管理器配合使用。Gunicorn 負責管理多個 Uvicorn 工作進程,提供了更強大的生產環境特性。

首先,安裝 Gunicorn 和 Uvicorn:

pip install "uvicorn[standard]" gunicorn

然后使用 Gunicorn 來啟動你的應用:

gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000
  • main:app: 和之前一樣。
  • -w 4, --workers 4: 設置工作進程的數量。
  • -k uvicorn.workers.UvicornWorker, --worker-class uvicorn.workers.UvicornWorker: 指定使用 Uvicorn 的工作器類。
  • -b 0.0.0.0:8000, --bind 0.0.0.0:8000: 綁定地址和端口。

這是部署 FastAPI/Starlette 應用的非常流行和穩健的方式。

方式 3: 使用 Docker 容器化部署(現代、標準的方式)

容器化部署提供了環境一致性、易于擴展和管理的巨大優勢。

  1. 創建 Dockerfile

    在你的項目根目錄下創建一個名為 Dockerfile 的文件(沒有擴展名)。

    # 使用官方 Python 基礎鏡像
    FROM python:3.9-slim# 設置工作目錄
    WORKDIR /app# 復制依賴文件并安裝
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt# 復制應用代碼
    COPY . .# 暴露端口
    EXPOSE 80# 運行應用
    # 方式 1: 直接使用 Uvicorn (適用于容器內部署)
    CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]# 方式 2: 使用 Gunicorn (更推薦用于生產)
    # CMD ["gunicorn", "main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:80"]
    
  2. 創建 .dockerignore (可選但推薦)

    __pycache__
    *.pyc
    .env
    .git
    
  3. 構建和運行 Docker 鏡像

    # 構建鏡像
    docker build -t my-fastapi-app .# 運行容器
    docker run -d -p 80:80 --name my-app my-fastapi-app
    

    現在你的應用就在 Docker 容器中運行了,可以通過宿主機的 80 端口訪問。

你可以輕松地將這個 Docker 鏡像部署到任何支持容器的平臺,如:

  • Kubernetes
  • Docker Compose (用于本地或單機部署)
  • Amazon ECS
  • Google Cloud Run
  • Azure Container Instances
方式 4: 使用其他 ASGI 服務器

除了 Uvicorn,你還可以選擇其他 ASGI 服務器,例如:

  • Hypercorn: 一個靈感來源于 Gunicorn 的 ASGI 服務器,也支持 HTTP/2。
    pip install hypercorn
    hypercorn main:app --bind 0.0.0.0:8000
    

第三部分:生產環境額外考慮事項

  1. 環境變量配置:使用 pydantic.BaseSettings(例如 pydantic-settings 庫)或 python-decouple 來管理敏感信息(如數據庫密碼、API 密鑰),不要將它們硬編碼在代碼中。

  2. 反向代理:在生產環境中,通常會在 FastAPI 應用前面放置一個反向代理服務器,如 NginxTraefik。它們可以處理:

    • 靜態文件:高效地提供圖片、CSS、JS 等文件,減輕 FastAPI 的負擔。
    • SSL 終止:處理 HTTPS 加密和解密。
    • 負載均衡:將流量分發到后端的多個應用實例。
    • GZip 壓縮等。
  3. 監控和日志:確保正確配置日志記錄。Uvicorn 和 Gunicorn 都有日志選項。考慮集成像 PrometheusGrafana 這樣的監控工具,FastAPI 有很好的 Prometheus 集成庫(如 fastapi-prometheus-grafana)。

總結

環境推薦方式命令示例
開發Uvicorn + --reloaduvicorn main:app --reload
生產(簡單)Uvicorn 多 Workeruvicorn main:app --host 0.0.0.0 --port 80 --workers 4
生產(推薦)Gunicorn + Uvicorn Workergunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker ...
生產(現代)Docker + (Uvicorn/Gunicorn)docker build ...

對于新項目,強烈推薦從 Docker化 并結合 Gunicorn + Uvicorn Worker 的方式開始,這為未來的擴展和部署提供了最大的靈活性。

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

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

相關文章

【JavaWeb】之HTML(對HTML細節的一些總結)

大家天天開心! 文章目錄 前言一、HTML的簡介二、HTML運行方式三、html 的標簽/元素-說明四、表單注意事項總結 前言 首先我們在把Java基礎學習完之后,我們就要進行網站方面的開發了,我們要了解網頁的組成,而網頁的組成有HTML,CSS,…

互聯網醫院品牌IP的用戶體驗和生態構建

一、患者體驗與信任構建互聯網醫院品牌IP的價值核心在于獲得患者的深度信任,而卓越的用戶體驗是實現這一目標的關鍵路徑。在醫療服務同質化嚴重的當下,患者體驗已成為醫療機構差異化競爭的重要維度。研究表明,良好的用戶體驗能夠提高用戶滿意…

【Node.js教程】Express框架入門:從搭建到動態渲染商品列表

前言 Visual Studio Code(簡稱VSCode)是微軟開發的一款免費開源跨平臺代碼編輯器,憑借其免費、開源、跨平臺的特性,以及豐富的插件生態和美觀的界面,成為前端開發者的首選工具。 本文將帶你從零開始學習Express框架,包括搭建項目、配置路由、使用中間件以及實現動態渲染…

眾擎機器人開源代碼解讀

一,綜述 EngineAI ROS 包: 高層開發模式:用戶可通過發布身體速度指令,直接調用 EngineAI 機器人的行走控制器。底層開發模式:用戶可通過發布關節指令,自主開發專屬的控制器。 ROS2 package:全…

Windows系統安裝Git詳細教程

文章目錄步驟 1:下載 Git 安裝包步驟 2:運行安裝程序步驟 3:選擇安裝路徑步驟 4:選擇組件步驟 5:選擇默認編輯器步驟 6:選擇路徑環境變量步驟 7:選擇 HTTPS 協議的傳輸方式步驟 8:配…

leetcode 3446. 按對角線進行矩陣排序 中等

給你一個大小為 n x n 的整數方陣 grid。返回一個經過如下調整的矩陣:左下角三角形(包括中間對角線)的對角線按 非遞增順序 排序。右上角三角形 的對角線按 非遞減順序 排序。示例 1:輸入: grid [[1,7,3],[9,8,2],[4,…

攜程旅行 web 驗證碼 分析

聲明 本文章中所有內容僅供學習交流使用,不用于其他任何目的,抓包內容、敏感網址、數據接口等均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此產生的一切后果均與作者無關! 逆向分析 部分python代碼 result cp…

JavaEE 進階第一期:開啟前端入門之旅(上)

專欄:JavaEE 進階躍遷營 個人主頁:手握風云 一、HTML基礎 1.1. 什么是HTML HTML(Hyper Text Markup Language),超文本標記語言。 超文本:比文本要強大,通過鏈接和交互式方式來組織和呈現信息的文本形式。不僅僅有文本…

4.5 PBR

1.PBR簡介 2.高光工作流 3.金屬工作流1.PBR簡介 PBR(Physically Based Rendering, 基于物理的渲染)的工作流分為金屬工作流和高光工作流2.高光工作流 高光工作流是一種傳統的工作流, 現在用的相對較少, 但是在某些特定情況下能提供更精細的控制a.核心思想它不區分金屬和非金屬,…

09.《路由基礎知識解析和實踐》

09.路由基礎 文章目錄09.路由基礎核心概念路由關鍵組成部分三層轉發原理介紹(通信流程)路由類型及配置直連路由(direct)實驗示例**靜態路由(Static)****實驗示例****動態路由****RIP(routing information protocol---路…

websocket建立連接過程

1. 客戶端發送一個GET的http請求,請求頭要包含connection: upgradehost:localhost:8000。表明地址upgrade: websocket。指明升級的協議sec-websocket-key 。 安全驗證密鑰sec-websocket-version。 協議版本sec-websocket-accept 。對傳過來的key進行加密…

Simulink庫文件-一種低通濾波模塊搭建方法

在汽車電控系統應用層開發中,經常會用到低通濾波模塊,其主要作用是去除輸入信號中的高頻干擾,防止由于輸入信號的干擾引起后續執行系統的非預期頻繁波動。本文介紹簡要介紹低通濾波的定義及作用,并介紹一種低通濾波模塊simulink搭…

【C++游記】AVL樹

楓の個人主頁 你不能改變過去,但你可以改變未來 算法/C/數據結構/C Hello,這里是小楓。C語言與數據結構和算法初階兩個板塊都更新完畢,我們繼續來學習C的內容呀。C是接近底層有比較經典的語言,因此學習起來注定枯燥無味&#xf…

音視頻學習(六十二):H264中的SEI

什么是SEI? 在 H.264 視頻編碼標準中,補充增強信息(Supplemental Enhancement Information,SEI) 是一種特殊的 NAL(網絡抽象層)單元。它不像序列參數集(SPS)或圖像參數集&#xff0…

docker run 后報錯/bin/bash: /bin/bash: cannot execute binary file總結

以下方法來源于AI&#xff0c;個人僅驗證了第三條便成功執行 1. 鏡像與宿主機架構不匹配 比如&#xff1a; 你是 x86_64 的機器&#xff0c;但鏡像是 ARM64 的&#xff08;或反之&#xff09;。在 PC 上拉了樹莓派用的鏡像。查看鏡像架構 docker inspect <image_name> | …

【Redisson 加鎖源碼解析】

Redisson 源碼解析 —— 分布式鎖實現過程 在分布式系統中&#xff0c;分布式鎖 是非常常見的需求&#xff0c;用來保證多個節點之間的互斥操作。Redisson 是 Redis 的一個 Java 客戶端&#xff0c;它提供了對分布式鎖的良好封裝。本文將從源碼角度剖析 Redisson 的分布式鎖實現…

uni-app支持單多選、搜索、查詢、限制能否點擊組件

<template><view class="multi-select-container" :class="{ single-select: !multiple, no-search: !searchable }"><!-- 當組件被禁用時,直接顯示選中的內容 --><view class="disabled-display" v-if="disabled &a…

TFT屏幕:STM32硬件SPI+DMA+隊列自動傳輸

看了網上的很多的SPIDMA的代碼&#xff0c;感覺都有一些缺陷&#xff0c;就是基本都是需要有手動等待DMA完成的這個操作&#xff0c;我感覺這種等待操作在很大程度上浪費了時間&#xff0c;那么我加入的“隊列”就是一種將等待時間利用起來的方法。原本的SPIDMA的操作邏輯如下圖…

AI操作系統語言模型設計 之1 基于意識的Face-Gate-Window的共軛路徑的思維-認知-情感嵌套模型

摘要&#xff08;AI生成&#xff09;本文提出了一種創新的AI操作系統語言模型設計框架&#xff0c;將人類意識活動的分層結構映射到人工智能系統中。該模型包含三個嵌套層次&#xff1a;理性思維層&#xff08;Face層&#xff09;&#xff1a;采用雙面膠隱喻&#xff08;A/B面&…

瘋狂星期四文案網第57天運營日記

網站運營第57天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今日搜索引擎收錄情況