您好,登錄后才能下訂單哦!
這篇文章主要講解了Python中FastAPI構(gòu)建Web服務(wù)的實現(xiàn)方法,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。
FastAPI 是一個使用 Python 編寫的 Web 框架,還應(yīng)用了 Python asyncio 庫中最新的優(yōu)化。本文將會介紹如何搭建基于容器的開發(fā)環(huán)境,還會展示如何使用 FastAPI 實現(xiàn)一個小型 Web 服務(wù)。
起步
我們將使用 Fedora 作為基礎(chǔ)鏡像來搭建開發(fā)環(huán)境,并使用 Dockerfile 為鏡像注入 FastAPI、Uvicorn 和 aiofiles 這幾個包。
FROM fedora:32 RUN dnf install -y python-pip \ && dnf clean all \ && pip install fastapi uvicorn aiofiles WORKDIR /srv CMD ["uvicorn", "main:app", "--reload"]
在工作目錄下保存 Dockerfile 之后,執(zhí)行 podman 命令構(gòu)建容器鏡像。
$ podman build -t fastapi . $ podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/fastapi latest 01e974cabe8b 18 seconds ago 326 MB
下面我們可以開始創(chuàng)建一個簡單的 FastAPI 應(yīng)用程序,并通過容器鏡像運行。
from fastapi import FastAPI app = 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 服務(wù)就跑起來了。由于指定了 --reload 參數(shù),一旦 main.py 文件發(fā)生了改變,整個應(yīng)用都會自動重新加載。你可以嘗試將返回信息 "Hello Fedora Magazine!" 修改為其它內(nèi)容,然后觀察效果。
可以使用以下命令停止應(yīng)用程序:
$ podman stop fastapi
構(gòu)建一個小型 Web 服務(wù)
接下來我們會構(gòu)建一個需要 I/O 操作的應(yīng)用程序,通過這個應(yīng)用程序,我們可以看到 FastAPI 自身的特點,以及它在性能上有什么優(yōu)勢(可以在這里參考 FastAPI 和其它 Python Web 框架的對比)。為簡單起見,我們直接使用 dnf history 命令的輸出來作為這個應(yīng)用程序使用的數(shù)據(jù)。
首先將 dnf history 命令的輸出保存到文件。
$ dnf history | tail --lines=+3 > history.txt
在上面的命令中,我們使用 tail 去除了 dnf history 輸出內(nèi)容中無用的表頭信息。剩余的每一條 dnf 事務(wù)都包括了以下信息:
然后修改 main.py 文件將相關(guān)的數(shù)據(jù)結(jié)構(gòu)添加進去。
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class DnfTransaction(BaseModel): id: int command: str date: str
FastAPI 自帶的 pydantic 庫讓你可以輕松定義一個數(shù)據(jù)類,其中的類型注釋對數(shù)據(jù)的驗證也提供了方便。
再增加一個函數(shù),用于從 history.txt 文件中讀取數(shù)據(jù)。
import aiofiles from fastapi import FastAPI from 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
這個函數(shù)中使用了 aiofiles 庫,這個庫提供了一個異步 API 來處理 Python 中的文件,因此打開文件或讀取文件的時候不會阻塞其它對服務(wù)器的請求。
最后,修改 root 函數(shù),讓它返回事務(wù)列表中的數(shù)據(jù)。
@app.get("/") async def read_root(): return await read_history()
執(zhí)行以下命令就可以看到應(yīng)用程序的輸出內(nèi)容了。
$ 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" }, .... ]
看完上述內(nèi)容,是不是對Python中FastAPI構(gòu)建Web服務(wù)的實現(xiàn)方法有進一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。