新聞中心
FastAPI 是一個使用 Python 編寫的 Web 框架,還應用了 Python asyncio 庫中最新的優(yōu)化。本文將會介紹如何搭建基于容器的開發(fā)環(huán)境,還會展示如何使用 FastAPI 實現一個小型 Web 服務。

創(chuàng)新互聯是一家從事企業(yè)網站建設、成都網站制作、成都做網站、外貿營銷網站建設、行業(yè)門戶網站建設、網頁設計制作的專業(yè)的建站公司,擁有經驗豐富的網站建設工程師和網頁設計人員,具備各種規(guī)模與類型網站建設的實力,在網站建設領域樹立了自己獨特的設計風格。自公司成立以來曾獨立設計制作的站點上1000家。
起步
我們將使用 Fedora 作為基礎鏡像來搭建開發(fā)環(huán)境,并使用 Dockerfile 為鏡像注入 FastAPI、Uvicorn 和 aiofiles 這幾個包。
FROM fedora:32RUN dnf install -y python-pip \&& dnf clean all \&& pip install fastapi uvicorn aiofilesWORKDIR /srvCMD ["uvicorn", "main:app", "--reload"]
在工作目錄下保存 Dockerfile 之后,執(zhí)行 podman 命令構建容器鏡像。
$ podman build -t fastapi .$ podman imagesREPOSITORY TAG IMAGE ID CREATED SIZElocalhost/fastapi latest 01e974cabe8b 18 seconds ago 326 MB
下面我們可以開始創(chuàng)建一個簡單的 FastAPI 應用程序,并通過容器鏡像運行。
from fastapi import FastAPIapp = FastAPI()@app.get("/")async def root():return {"message": "Hello Fedora Magazine!"}
將上面的代碼保存到 main.py 文件中,然后執(zhí)行以下命令開始運行:
$ podman run --rm -v $PWD:/srv:z -p 8000:8000 --name fastapi -d fastapi$ curl http://127.0.0.1:8000{"message":"Hello Fedora Magazine!"
這樣,一個基于 FastAPI 的 Web 服務就跑起來了。由于指定了 --reload 參數,一旦 main.py 文件發(fā)生了改變,整個應用都會自動重新加載。你可以嘗試將返回信息 "Hello Fedora Magazine!" 修改為其它內容,然后觀察效果。
可以使用以下命令停止應用程序:
$ podman stop fastapi
構建一個小型 Web 服務
接下來我們會構建一個需要 I/O 操作的應用程序,通過這個應用程序,我們可以看到 FastAPI 自身的特點,以及它在性能上有什么優(yōu)勢(可以在這里參考 FastAPI 和其它 Python Web 框架的對比)。為簡單起見,我們直接使用 dnf history 命令的輸出來作為這個應用程序使用的數據。
首先將 dnf history 命令的輸出保存到文件。
$ dnf history | tail --lines=+3 > history.txt
在上面的命令中,我們使用 tail 去除了 dnf history 輸出內容中無用的表頭信息。剩余的每一條 dnf 事務都包括了以下信息:
id:事務編號(每次運行一條新事務時該編號都會遞增)command:事務中運行的dnf命令date:執(zhí)行事務的日期和時間
然后修改 main.py 文件將相關的數據結構添加進去。
from fastapi import FastAPIfrom pydantic import BaseModelapp = FastAPI()class DnfTransaction(BaseModel):id: intcommand: strdate: str
FastAPI 自帶的 pydantic 庫讓你可以輕松定義一個數據類,其中的類型注釋對數據的驗證也提供了方便。
再增加一個函數,用于從 history.txt 文件中讀取數據。
import aiofilesfrom fastapi import FastAPIfrom pydantic import BaseModelapp = FastAPI()class DnfTransaction(BaseModel):id: intcommand: strdate: strasync def read_history():transactions = []async with aiofiles.open("history.txt") as f:async for line in f:transactions.append(DnfTransaction(id=line.split("|")[0].strip(" "),command=line.split("|")[1].strip(" "),date=line.split("|")[2].strip(" ")))return transactions
這個函數中使用了 aiofiles 庫,這個庫提供了一個異步 API 來處理 Python 中的文件,因此打開文件或讀取文件的時候不會阻塞其它對服務器的請求。
最后,修改 root 函數,讓它返回事務列表中的數據。
@app.get("/")async def read_root():return await read_history()
執(zhí)行以下命令就可以看到應用程序的輸出內容了。
$ curl http://127.0.0.1:8000 | python -m json.tool[{"id": 103,"command": "update","date": "2020-05-25 08:35"},{"id": 102,"command": "update","date": "2020-05-23 15:46"},{"id": 101,"command": "update","date": "2020-05-22 11:32"},....]
總結
FastAPI 提供了一種使用 asyncio 構建 Web 服務的簡單方法,因此它在 Python Web 框架的生態(tài)中日趨流行。要了解 FastAPI 的更多信息,歡迎查閱 FastAPI 文檔。
本文中的代碼可以在 GitHub 上找到。
分享題目:使用PythonFastAPI構建Web服務
轉載注明:http://m.fisionsoft.com.cn/article/djjjhos.html


咨詢
建站咨詢
