- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Python中怎么利用 FastAPI構建一個(gè)Web服務(wù)
Python中怎么利用 FastAPI構建一個(gè)Web服務(wù),很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細講解,有這方面需求的人可以來(lái)學(xué)習下,希望你能有所收獲。
我們將使用 Fedora 作為基礎鏡像來(lái)搭建開(kāi)發(fā)環(huán)境,并使用 Dockerfile 為鏡像注入 FastAPI、Uvicorn 和 aiofiles 這幾個(gè)包。
FROM fedora:32RUN dnf install -y python-pip \ && dnf clean all \ && pip install fastapi uvicorn aiofilesWORKDIR /srvCMD ["uvicorn", "main:app", "--reload"]
在工作目錄下保存 Dockerfile
之后,執行 podman
命令構建容器鏡像。
$ podman build -t fastapi .$ podman imagesREPOSITORY TAG IMAGE ID CREATED SIZElocalhost/fastapi latest 01e974cabe8b 18 seconds ago 326 MB
下面我們可以開(kāi)始創(chuàng )建一個(gè)簡(jiǎn)單的 FastAPI 應用程序,并通過(guò)容器鏡像運行。
from fastapi import FastAPI app = FastAPI() @app.get("/")async def root(): return {"message": "Hello Fedora Magazine!"}
將上面的代碼保存到 main.py
文件中,然后執行以下命令開(kāi)始運行:
$ 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!"
這樣,一個(gè)基于 FastAPI 的 Web 服務(wù)就跑起來(lái)了。由于指定了 --reload
參數,一旦 main.py
文件發(fā)生了改變,整個(gè)應用都會(huì )自動(dòng)重新加載。你可以嘗試將返回信息 "Hello Fedora Magazine!"
修改為其它內容,然后觀(guān)察效果。
可以使用以下命令停止應用程序:
$ podman stop fastapi
接下來(lái)我們會(huì )構建一個(gè)需要 I/O 操作的應用程序,通過(guò)這個(gè)應用程序,我們可以看到 FastAPI 自身的特點(diǎn),以及它在性能上有什么優(yōu)勢(可以在這里參考 FastAPI 和其它 Python Web 框架的對比)。為簡(jiǎn)單起見(jiàn),我們直接使用 dnf history
命令的輸出來(lái)作為這個(gè)應用程序使用的數據。
首先將 dnf history
命令的輸出保存到文件。
$ dnf history | tail --lines=+3 > history.txt
在上面的命令中,我們使用 tail
去除了 dnf history
輸出內容中無(wú)用的表頭信息。剩余的每一條 dnf
事務(wù)都包括了以下信息:
id
:事務(wù)編號(每次運行一條新事務(wù)時(shí)該編號都會(huì )遞增)
command
:事務(wù)中運行的 dnf
命令
date
:執行事務(wù)的日期和時(shí)間
然后修改 main.py
文件將相關(guān)的數據結構添加進(jìn)去。
from fastapi import FastAPIfrom pydantic import BaseModel app = FastAPI() class DnfTransaction(BaseModel): id: int command: str date: str
FastAPI 自帶的 pydantic 庫讓你可以輕松定義一個(gè)數據類(lèi),其中的類(lèi)型注釋對數據的驗證也提供了方便。
再增加一個(gè)函數,用于從 history.txt
文件中讀取數據。
import aiofiles from fastapi import FastAPIfrom pydantic import BaseModel app = FastAPI() class DnfTransaction(BaseModel): id: int command: str date: str async 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
這個(gè)函數中使用了 aiofiles
庫,這個(gè)庫提供了一個(gè)異步 API 來(lái)處理 Python 中的文件,因此打開(kāi)文件或讀取文件的時(shí)候不會(huì )阻塞其它對的請求。
最后,修改 root
函數,讓它返回事務(wù)列表中的數據。
@app.get("/")async def read_root(): return await read_history()
執行以下命令就可以看到應用程序的輸出內容了。
$ 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"},....]
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站