使用Python FastAPI構(gòu)建Web服務(wù)的實(shí)現(xiàn)
FastAPI 是一個(gè)使用 Python 編寫的 Web 框架,還應(yīng)用了 Python asyncio 庫中最新的優(yōu)化。本文將會(huì)介紹如何搭建基于容器的開發(fā)環(huán)境,還會(huì)展示如何使用 FastAPI 實(shí)現(xiàn)一個(gè)小型 Web 服務(wù)。
起步
我們將使用 Fedora 作為基礎(chǔ)鏡像來搭建開發(fā)環(huán)境,并使用 Dockerfile 為鏡像注入 FastAPI、Uvicorn 和 aiofiles 這幾個(gè)包。
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)建一個(gè)簡(jiǎn)單的 FastAPI 應(yīng)用程序,并通過容器鏡像運(yùn)行。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello Fedora Magazine!"}
將上面的代碼保存到 main.py 文件中,然后執(zhí)行以下命令開始運(yùn)行:
$ 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ù)就跑起來了。由于指定了 --reload 參數(shù),一旦 main.py 文件發(fā)生了改變,整個(gè)應(yīng)用都會(huì)自動(dòng)重新加載。你可以嘗試將返回信息 "Hello Fedora Magazine!" 修改為其它內(nèi)容,然后觀察效果。
可以使用以下命令停止應(yīng)用程序:
$ podman stop fastapi
構(gòu)建一個(gè)小型 Web 服務(wù)
接下來我們會(huì)構(gòu)建一個(gè)需要 I/O 操作的應(yīng)用程序,通過這個(gè)應(yīng)用程序,我們可以看到 FastAPI 自身的特點(diǎn),以及它在性能上有什么優(yōu)勢(shì)(可以在這里參考 FastAPI 和其它 Python Web 框架的對(duì)比)。為簡(jiǎn)單起見,我們直接使用 dnf history 命令的輸出來作為這個(gè)應(yīng)用程序使用的數(shù)據(jù)。
首先將 dnf history 命令的輸出保存到文件。
$ dnf history | tail --lines=+3 > history.txt
在上面的命令中,我們使用 tail 去除了 dnf history 輸出內(nèi)容中無用的表頭信息。剩余的每一條 dnf 事務(wù)都包括了以下信息:
- id:事務(wù)編號(hào)(每次運(yùn)行一條新事務(wù)時(shí)該編號(hào)都會(huì)遞增)
- command:事務(wù)中運(yùn)行的 dnf 命令
- date:執(zhí)行事務(wù)的日期和時(shí)間
然后修改 main.py 文件將相關(guān)的數(shù)據(jù)結(jié)構(gòu)添加進(jìn)去。
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class DnfTransaction(BaseModel): id: int command: str date: str
FastAPI 自帶的 pydantic 庫讓你可以輕松定義一個(gè)數(shù)據(jù)類,其中的類型注釋對(duì)數(shù)據(jù)的驗(yàn)證也提供了方便。
再增加一個(gè)函數(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
這個(gè)函數(shù)中使用了 aiofiles 庫,這個(gè)庫提供了一個(gè)異步 API 來處理 Python 中的文件,因此打開文件或讀取文件的時(shí)候不會(huì)阻塞其它對(duì)服務(wù)器的請(qǐng)求。
最后,修改 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"
},
....
]
總結(jié)
FastAPI 提供了一種使用 asyncio 構(gòu)建 Web 服務(wù)的簡(jiǎn)單方法,因此它在 Python Web 框架的生態(tài)中日趨流行。要了解 FastAPI 的更多信息,歡迎查閱 FastAPI 文檔。
本文中的代碼可以在 GitHub 上找到。
到此這篇關(guān)于使用Python FastAPI構(gòu)建Web服務(wù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python FastAPI構(gòu)建Web服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中對(duì)數(shù)據(jù)庫的操作詳解
今天簡(jiǎn)單說說MySQL,我們存儲(chǔ)數(shù)據(jù),直接用本地文件即可,但是,本地文件不利于存放海量數(shù)據(jù),也不利于用程序?qū)ξ募臄?shù)據(jù)進(jìn)行查詢與管理,我們可以使用數(shù)據(jù)庫2023-02-02
python實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Python爬蟲原理與基本請(qǐng)求庫urllib詳解
這篇文章主要介紹了Python爬蟲原理與基本請(qǐng)求庫urllib詳解,爬蟲就是通過模擬瀏覽器,按照一定的規(guī)則,自動(dòng)、大批量的獲取網(wǎng)絡(luò)資源,包括文本、圖片、鏈接、音頻、視頻等等,需要的朋友可以參考下2023-07-07
Python 打印自己設(shè)計(jì)的字體的實(shí)例講解
在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于Python 打印自己設(shè)計(jì)的字體的實(shí)例講解內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。2021-01-01
Python用20行代碼實(shí)現(xiàn)完整郵件功能
這篇文章主要介紹了如何使用Python實(shí)現(xiàn)完整郵件功能的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容,希望能幫助到您2021-09-09

