Python FastAPI入門(mén)安裝使用
第一節(jié):FastAPI入門(mén)
一、FastAPI框架介紹
FastAPI是一個(gè)現(xiàn)代、快速的Python Web框架,用于構(gòu)建API。它基于Python 3.6+的類(lèi)型提示特性,使得代碼更加簡(jiǎn)潔且易于綬護(hù)。
關(guān)鍵特性:
快速:可與 NodeJS 和 Go 并肩的極高性能(歸功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
高效編碼:提高功能開(kāi)發(fā)速度約 200% 至 300%。
更少 bug:減少約 40% 的人為(開(kāi)發(fā)者)導(dǎo)致錯(cuò)誤。
智能:極佳的編輯器支持。處處皆可自動(dòng)補(bǔ)全,減少調(diào)試時(shí)間。
簡(jiǎn)單:設(shè)計(jì)的易于使用和學(xué)習(xí),閱讀文檔的時(shí)間更短。
簡(jiǎn)短:使代碼重復(fù)最小化。通過(guò)不同的參數(shù)聲明實(shí)現(xiàn)豐富功能。bug 更少。
健壯:生產(chǎn)可用級(jí)別的代碼。還有自動(dòng)生成的交互式文檔。
標(biāo)準(zhǔn)化:基于(并完全兼容)API 的相關(guān)開(kāi)放標(biāo)準(zhǔn):OpenAPI (以前被稱(chēng)為 Swagger) 和 JSON Schema。
FastAPI 站在巨人的肩膀上:
- Starlette 用于構(gòu)建 Web 部件:Starlette 是一個(gè)輕量級(jí)的 ASGI 框架和工具包,特別適合用來(lái)構(gòu)建高性能的 asyncio 服務(wù).
- Pydantic 用于數(shù)據(jù)的操作:python 中用于數(shù)據(jù)接口定義檢查與設(shè)置管理的庫(kù)。
什么是ASGI服務(wù)(WSGI)
WSGI,(WEB SERVER GATEWAY INTERFACE),Web服務(wù)器網(wǎng)關(guān)接口,是一種Web服務(wù)器網(wǎng)關(guān)接口,它是一個(gè)Web服務(wù)器(如Nginx,uWSGI等服務(wù)器)與Web應(yīng)用(如Flask框架寫(xiě)的程序)通信的一種規(guī)范。當(dāng)前運(yùn)行在WSGI協(xié)議之上的Web框架有Bottle,F(xiàn)lask,Django。
ASGI:異步網(wǎng)關(guān)協(xié)議接口( Asynchronous Server Gateway Interface ) ,一個(gè)介于網(wǎng)絡(luò)協(xié)議服務(wù)和Python應(yīng)用之間的標(biāo)準(zhǔn)接口,能夠處理多種通用的協(xié)議類(lèi)型,包括HTTP,HTTP2和WebSocket。
WSGI和ASGI的區(qū)別
WSGI是基于HTTP協(xié)議模式的,不支持WebSocket,而ASGI的誕生則是為了解決Python常用的WSGI不支持當(dāng)前Web開(kāi)發(fā)中的一些新的協(xié)議標(biāo)準(zhǔn)。同時(shí),ASGI對(duì)于WSGI原有的模式的支持和WebSocket的擴(kuò)展,即ASGI是WSGI的擴(kuò)展。
1、補(bǔ)充Web開(kāi)發(fā)
Web應(yīng)用開(kāi)發(fā)主要是建立在B/S架構(gòu)模式下,衍生出來(lái)的一系列web應(yīng)用程序,即主要是基于瀏覽器的應(yīng)用程序開(kāi)發(fā),這也是web應(yīng)用程序開(kāi)發(fā)的基礎(chǔ),比如淘寶、京東、當(dāng)當(dāng)網(wǎng)等。Web開(kāi)發(fā)在近年來(lái),隨著本身技術(shù)的突破以及移動(dòng)設(shè)備的普及,基于web領(lǐng)域的開(kāi)發(fā),也出現(xiàn)了明確的崗位職責(zé)分工,一個(gè)web互聯(lián)網(wǎng)產(chǎn)品中,基本上會(huì)分為web UI設(shè)計(jì)、Web前端開(kāi)發(fā)以及web后端開(kāi)發(fā)。
1)Web前端開(kāi)發(fā)
Web前端開(kāi)發(fā)用到的編程語(yǔ)言主要有javascript,以及伴隨有標(biāo)記性文本語(yǔ)言html和樣式渲染方式CSS。以及近年來(lái)衍生出來(lái)的一批優(yōu)秀web前端框架,使web前端在應(yīng)用構(gòu)建方面的效率得到顯著提升。另外nodeJs的出現(xiàn),越來(lái)越多的web前端開(kāi)發(fā)人員開(kāi)始走入服務(wù)端編程領(lǐng)域,甚至在一些項(xiàng)目中扮演著web全棧開(kāi)發(fā)的角色。
2)Web后端開(kāi)發(fā)
Web后端開(kāi)發(fā),主要用到的語(yǔ)言有python、php、java等,當(dāng)然隨著nodeJs的興起,也成為近年來(lái)服務(wù)端開(kāi)發(fā)的另一種選擇。
Web應(yīng)用程序開(kāi)發(fā)是基于瀏覽器的,瀏覽器本身已經(jīng)解決了多平臺(tái)性兼容的問(wèn)題,所以web開(kāi)發(fā)一般是無(wú)需考慮跨平臺(tái)所面臨的兼容性問(wèn)題。但是,web開(kāi)發(fā)領(lǐng)域需要解決的有另一類(lèi)問(wèn)題,那便是多端兼容以及融合的問(wèn)題,雖然web是基于瀏覽器的,沒(méi)有跨平臺(tái)的問(wèn)題,但多端的快速發(fā)展,是web開(kāi)發(fā)領(lǐng)域的新問(wèn)題,即PC端、移動(dòng)端以及當(dāng)下比較火熱的各類(lèi)小程序端。
二、FastAPI安裝
1、安裝Python虛擬環(huán)境
為什么要使用虛擬環(huán)境
- 項(xiàng)目部署時(shí),直接導(dǎo)出項(xiàng)目對(duì)應(yīng)的環(huán)境中的庫(kù)就可以了;
- 同時(shí)開(kāi)發(fā)多個(gè)項(xiàng)目,各自項(xiàng)目使用的python版本不同,譬如一個(gè)是python2,另一個(gè)是python3,那么需要來(lái)回的切換python版本;
- 當(dāng)你同時(shí)開(kāi)發(fā)多個(gè)項(xiàng)目時(shí),特別是多個(gè)項(xiàng)目使用同一個(gè)庫(kù),譬如:django,但是各自項(xiàng)目使用的django的版本不一致時(shí),那么你在開(kāi)發(fā)這些項(xiàng)目時(shí),需要來(lái)回的卸載和安裝不同的版本,因?yàn)橥粋€(gè)python環(huán)境中,同名的庫(kù)只能有一個(gè)版本。
虛擬環(huán)境的安裝步驟
安裝好python環(huán)境
安裝虛擬環(huán)境庫(kù),在cmd中輸入:
pip install virtualenv
創(chuàng)建虛擬環(huán)境,在cmd中切換到需要?jiǎng)?chuàng)建虛擬環(huán)境的目錄下,執(zhí)行:
virtualenv env_name
激活虛擬環(huán)境,在cmd中進(jìn)入到 第三步創(chuàng)建的 env_name/Scripts 目錄下,執(zhí)行:
activate
執(zhí)行成功后,在cmd中,當(dāng)前輸入行前面會(huì)有 (env_name) 的前綴
在當(dāng)前狀態(tài)下,使用 pip 就是在虛擬環(huán)境中安裝第三方庫(kù)了
退出虛擬環(huán)境,cmd中輸入:
deactivate
2、安裝FastAPI
需要安裝所有的可選依賴(lài)及對(duì)應(yīng)功能,包括了 uvicorn
,你可以將其用作運(yùn)行代碼的服務(wù)器。
pip install fastapi[all] -i https://pypi.douban.com/simple/
你也可以分開(kāi)來(lái)安裝。
假如你想將應(yīng)用程序部署到生產(chǎn)環(huán)境,你可能要執(zhí)行以下操作:
pip install fastapi
并且安裝 uvicorn
來(lái)作為服務(wù)器:
pip install "uvicorn[standard]"
三、第一個(gè)FastAPI案例
創(chuàng)建一個(gè)main.py
from fastapi import FastAPI app = FastAPI() @app.get("/") def root(): return 'hello' @app.get("/hello/{name}") def say_hello(name: str): return {"message": f"Hello {name}"} # 可以不要 if __name__ == "__main__": import uvicorn uvicorn.run(app, host="127.0.0.1", port=8000)
1、訪問(wèn)接口和文檔
2、接口文檔半天打不開(kāi)的解決
這個(gè)接口文檔調(diào)用了一個(gè) js腳本,這個(gè)腳本是部署在國(guó)外的,總之 就是因?yàn)檫@個(gè)原因?qū)е挛覀儧](méi)法訪問(wèn)了,由此我們需要把這個(gè)腳本從網(wǎng)上下載下來(lái),放到本地,把此處調(diào)用國(guó)外的腳本變成調(diào)用我們自己本地的,即可。
1)下載這些國(guó)外服務(wù)器的資源到一個(gè)static目錄中
2)復(fù)制到項(xiàng)目中
3)修改fastapi的源代碼
4) 在app中注冊(cè)static目錄
5)打開(kāi)接口文檔
3、總結(jié)
1)uvicorn命令說(shuō)明:
uvicorn main:app
命令含義如下:
main
:main.py
文件(一個(gè) Python「模塊」)。app
:在main.py
文件中通過(guò)app = FastAPI()
創(chuàng)建的對(duì)象。--reload
:讓服務(wù)器在更新代碼后重新啟動(dòng)。僅在開(kāi)發(fā)時(shí)使用該選項(xiàng)。
2)app變量
這里的變量 app
會(huì)是 FastAPI
類(lèi)的一個(gè)實(shí)例 變量名字。這個(gè)實(shí)例將是創(chuàng)建你所有 API 的主要交互對(duì)象。
也可以修改app變量名字:
from fastapi import FastAPI my_awesome_api = FastAPI() @my_awesome_api.get("/") def root(): return {"message": "Hello World"}
3)請(qǐng)求路徑(路由)
請(qǐng)求路徑指的是 URL 中從第一個(gè) /
起的后半部分。所以,在一個(gè)這樣的 URL 中:
http://example.com/items/foo
http://127.0.0.1/items/foo
那么,真正的請(qǐng)求路徑(路由)是:/items/foo
在FastAPI中,路由的配置是通過(guò): 裝飾器 完成的。
4)請(qǐng)求方法(操作)
在 HTTP 協(xié)議中,你可以使用以下的其中一種(或多種)請(qǐng)求方法 與每個(gè)路徑進(jìn)行通信。
通常使用:
POST
:創(chuàng)建數(shù)據(jù)。GET
:讀取數(shù)據(jù)。PUT
:更新數(shù)據(jù)。DELETE
:刪除數(shù)據(jù)。- PATCH: 修改單一數(shù)據(jù)
配置請(qǐng)求方法:
@app.post()
@app.put()
@app.delete()
- @app.get()
以及更少見(jiàn)的:
@app.options()
@app.head()
@app.patch()
@app.trace()
5)路由+請(qǐng)求方法 +函數(shù)的映射
- 路徑 :是
/
- 操作 :是
get
- 函數(shù) :是位于「裝飾器」下方的函數(shù)(位于
@app.get("/")
下方)
@app.get("/") def root(): return {"message": "Hello World"}
6)返回響應(yīng)
from fastapi import FastAPI app = FastAPI() @app.get("/") def root(): return {"message": "Hello World"} # 返回響應(yīng)
你還可以返回一個(gè) dict
、list
,像 str
、int
一樣的單個(gè)值,等等。你還可以返回 Pydantic 模型。還有許多其他將會(huì)自動(dòng)轉(zhuǎn)換為 JSON 的對(duì)象和模型(包括 ORM 對(duì)象等)。
四、路由參數(shù)
你可以使用與 Python 格式化字符串相同的語(yǔ)法來(lái)聲明路徑"參數(shù)"或"變量":
@app.get("/items/{item_id}") def read_item(item_id): return {"item_id": item_id}
路徑參數(shù) item_id
的值將作為參數(shù) item_id
傳遞給你的函數(shù)。所以,如果你運(yùn)行示例并訪問(wèn) http://127.0.0.1:8000/items/foo,將會(huì)看到如下響應(yīng):
{"item_id":"foo"}
1、定義參數(shù)的類(lèi)型
你可以使用標(biāo)準(zhǔn)的 Python 類(lèi)型標(biāo)注為函數(shù)中的路徑參數(shù)聲明類(lèi)型。
@app.get("/items/{item_id}") def read_item(item_id: int): return {"item_id": item_id}
在這個(gè)例子中,item_id
被聲明為 int
類(lèi)型。FastAPI 通過(guò)上面的類(lèi)型聲明提供了對(duì)請(qǐng)求的自動(dòng)"解析"。
同時(shí)還提供數(shù)據(jù)校驗(yàn)功能:
如果你通過(guò)瀏覽器訪問(wèn) http://127.0.0.1:8000/items/foo,你會(huì)看到一個(gè)清晰可讀的 HTTP 錯(cuò)誤:
{ "detail": [ { "loc": [ "path", "item_id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] }
因?yàn)槁窂絽?shù) item_id
傳入的值為 "foo"
,它不是一個(gè) int
。
你可以使用同樣的類(lèi)型聲明來(lái)聲明 str
、float
、bool
以及許多其他的復(fù)合數(shù)據(jù)類(lèi)型。
2、路由匹配的順序
由于路由匹配操作是按順序依次運(yùn)行的,你需要確保路徑 /users/me
聲明在路徑 /users/{user_id}
之前:
@app.get("/users/me") def read_user_me(): return {"user_id": "the current user"} @app.get("/users/{user_id}") def read_user(user_id: str): return {"user_id": user_id}
否則,/users/{user_id}
的路徑還將與 /users/me
相匹配,"認(rèn)為"自己正在接收一個(gè)值為 "me"
的 user_id
參數(shù)。
3、預(yù)設(shè)值參數(shù)
如果你有一個(gè)接收路徑參數(shù)的路徑操作,但你希望預(yù)先設(shè)定可能的有效參數(shù)值,則可以使用標(biāo)準(zhǔn)的 Python Enum
類(lèi)型。
Python中的枚舉數(shù)據(jù)類(lèi)型:是指列出有窮集合中的所有元素,即一一列舉的意思。在Python中,枚舉可以視為是一種數(shù)據(jù)類(lèi)型,當(dāng)一個(gè)變量的取值只有幾種有限的情況時(shí),我們可以將其聲明為枚舉類(lèi)型。例如表示周幾的這一變量weekday,只有七種可能的取值,我們就可以將其聲明為枚舉類(lèi)型。
from enum import Enum class Weekday(Enum): monday = 1 tuesday = 2 wednesday = 3 thirsday = 4 friday = 5 saturday = 6 sunday = 7 print(Weekday.wednesday) # Weekday.wednesday print(type(Weekday.wednesday)) # <enum 'Weekday'> print(Weekday.wednesday.name) # wednesday print(Weekday.wednesday.value) # 3
from enum import Enum from fastapi import FastAPI class ModelName(str, Enum): alexnet = "alexnet" resnet = "resnet" lenet = "lenet" app = FastAPI() @app.get("/models/{model_name}") async def get_model(model_name: ModelName): if model_name is ModelName.alexnet: return {"model_name": model_name, "message": "Deep Learning FTW!"} if model_name.value == "lenet": return {"model_name": model_name, "message": "LeCNN all the images"} return {"model_name": model_name, "message": "Have some residuals"}
到此這篇關(guān)于Python FastAPI入門(mén)安裝使用的文章就介紹到這了,更多相關(guān)Python FastAPI入門(mén)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python dash-fastapi前后端搭建過(guò)程
- Flask與FastAPI對(duì)比選擇最佳Python?Web框架的超詳細(xì)指南
- python如何通過(guò)FastAPI構(gòu)建復(fù)雜的Web?API
- 使用Python和FastAPI實(shí)現(xiàn)MinIO斷點(diǎn)續(xù)傳功能
- Python使用fastAPI如何實(shí)現(xiàn)一個(gè)流式傳輸接口
- Python?FastApi結(jié)合異步執(zhí)行方式
- Python使用fastapi快速編寫(xiě)一個(gè)增刪改查的接口
- Python web框架fastapi中間件的使用及CORS跨域問(wèn)題
- Python?搭建?FastAPI?項(xiàng)目的詳細(xì)過(guò)程
- Python FastAPI 多參數(shù)傳遞的示例詳解
相關(guān)文章
pyodps中的apply用法及groupby取分組排序第一條數(shù)據(jù)
這篇文章主要介紹了pyodps中的apply用法及groupby取分組排序第一條數(shù)據(jù),問(wèn)綻放圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值需要的小伙伴可以參考一下2022-05-05python中matplotlib調(diào)整圖例位置的方法實(shí)例
在matplotlib中,一般圖例默認(rèn)是在圖表內(nèi)部的,如果要放置到圖例外面,需要對(duì)坐標(biāo)進(jìn)行指定,下面這篇文章主要給大家介紹了關(guān)于python中matplotlib調(diào)整圖例位置的相關(guān)資料,需要的朋友可以參考下2022-06-06記錄一下scrapy中settings的一些配置小結(jié)
這篇文章主要介紹了記錄一下scrapy中settings的一些配置小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09使用Python畫(huà)出小人發(fā)射愛(ài)心的代碼
今天小編就為大家分享一篇使用Python畫(huà)出小人發(fā)射愛(ài)心的代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Python中使用urllib2防止302跳轉(zhuǎn)的代碼例子
這篇文章主要介紹了Python中使用urllib2防止302跳轉(zhuǎn)的代碼例子,即避免302跳轉(zhuǎn)的實(shí)現(xiàn),需要的朋友可以參考下2014-07-07Python Pandas實(shí)現(xiàn)數(shù)據(jù)分組求平均值并填充nan的示例
今天小編就為大家分享一篇Python Pandas實(shí)現(xiàn)數(shù)據(jù)分組求平均值并填充nan的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07python實(shí)現(xiàn)將漢字轉(zhuǎn)換成漢語(yǔ)拼音的庫(kù)
這篇文章主要介紹了python實(shí)現(xiàn)將漢字轉(zhuǎn)換成漢語(yǔ)拼音的庫(kù),涉及Python調(diào)用word.data字段實(shí)現(xiàn)將漢字轉(zhuǎn)換成拼音的功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05