FastAPI ------框架基础
FastAPI
- 一、初知FastAPI
- 1.1 FastAPI簡介
- 1.2 安裝FastAPI
- 1.2.1 虛擬環境安裝
- 1.2.2 pip安裝FastAPI
- 1.3 可能出現的問題
- Error: [WinError 10013] 以一種訪問權限不允許的方式做了一個訪問套接字的嘗試。
- 中文亂碼
- 二、 第一個FastAPI
- 2.1 方法一
- 2.2 方法二
- 2.3 方法三
- 2.4運行效果
- 三、API 文檔
- 3.1 交互式API 文檔
- 3.2 備用API 文檔
- 四、 Path 路徑參數
- 4.1 聲明路徑參數
- 4.2 路徑參數的類型
- 4.3 指定路徑順序
- 五、 Query 查詢參數
- 5.1 聲明 Query 參數
- 5.2 設置Query 參數
- 六、Request Body 請求體
- 注意事項
- 創建數據模型
- 七、Header 請求頭參數
- 八、Form 表單數據
- 九、操作MySQL
- 數據表模型
- 數據庫配置文件:
- 數據庫連接格式
- 連接數據庫文件
- 創建模型文件
- 模型對象方法
一、初知FastAPI
1.1 FastAPI簡介
FastAPI是一種現代,快速(高性能)的Web框架,用于基于標準 Python類型提示使用Python 3.6+構建API。基于以下第三方包開發(部分):
- Starlette基于ASGI異步網關協議接口的框架 。
- Pydantic數據驗證和設置管理庫。
- Uvicorn基于 asyncio(異步io) 開發的一個輕量級高效的 web 服務器框架。
- Requests HTTP庫。
- Aiofiles 如果要使用FileResponse(文件相應)靜態文件。
- Jinja2 網頁模板渲染引擎。
- Python-multipart 表單解析。
1.2 安裝FastAPI
1.2.1 虛擬環境安裝
安裝
.venv1是虛擬環境名,不一定是這個可以自己起名。
安裝教程
激活:
venv1\Scripts\activate1.2.2 pip安裝FastAPI
在虛擬環境中使用以下命令即可
pip install fastapi由于啟動需要依賴于Uvicorn,還需要安裝,命令如下
uvicorn
官方解釋:自行搜索。
通俗解釋:就是一個ASGI服務器,就是把你代碼跑在一個你認識的一個平臺上。
ASGI服務器:
解釋:異步網關協議接口。它是介于網絡協議服務和Python應用之間的標準接口。
通俗解釋:就是能夠處理多種通用的協議類型,例如:HTTP、HTTP2、WebSocket等
1.3 可能出現的問題
Error: [WinError 10013] 以一種訪問權限不允許的方式做了一個訪問套接字的嘗試。
這種情況就是端口占用
中文亂碼
這種情況博主還沒解決,不過在PyCharm中運行就不會出現。
二、 第一個FastAPI
2.1 方法一
在虛擬環境中運行
文件內容如下
第一行:導入了FastAPI類
第二行:創建了該類的一個實例
第四行:使用app()裝飾器告訴FastAPI什么樣的URL能觸發被裝飾的函數。
需要注意的是:
dict,list,單獨的值,比如str,int,或者是Pydantic模型
參數說明:
main:main.py文件
app :在main.py內部創建的對象,通過app = FastAPI()創建
--reload :使服務器在代碼更改后重新啟動,僅在開發的時候使用就好了。
2.2 方法二
也可以不在虛擬環境下運行,這就需要在本機上安裝上面說的兩個庫。
步驟和上面是類似的。
2.3 方法三
我們可不可以不用命令行運行呢,是可以的,看下面代碼:
from fastapi import FastAPI import uvicorn app = FastAPI()@app.get("/")def read_root():return {"Hello","World"}if __name__ == '__main__':uvicorn.run(app=app,host="127.0.0.1",port=8000)添加了
import uvicorn if __name__ == '__main__':uvicorn.run(app=app,host="127.0.0.1",port=8000).host="127.0.0.1",port=8000,表示指定本地電腦為服務器,端口號為8001
在PyCharm直接運行即可
2.4運行效果
三、API 文檔
.FastAPI提供了兩種文檔形式:交互式API 文檔 和備份API 文檔
3.1 交互式API 文檔
在新建的main.py文件中寫入,如下代碼:
from fastapi import FastAPI import uvicorn app = FastAPI()@app.get("/")async def read_root():return {"Hello","World"} @app.get("/items/{item_id}")def read_item(item_id:int,q:str =None):return {"item_id":item_id,"q":q}if __name__ == '__main__':uvicorn.run(app=app,host="127.0.0.1",port=8000)我們重點看第二個函數,其中{item_id}是路徑參數,q:str =None是查詢參數,詳細的會在后邊解釋。
我們運行后,在瀏覽器中輸入http://127.0.0.1:8000/docs
圖中的== GET ==就是 @app.get("/") 指定的請求方式,我們點擊第二個
填入信息后 單擊 Execute按鈕。
程序就會響應。
3.2 備用API 文檔
交互式是在后邊添加docs
備份則是 redoc
四、 Path 路徑參數
4.1 聲明路徑參數
@app.get("/items/{item_id}")def read_item(item_id:int):return {"item_id":item_id}- 其中{item_id}就是路徑參數,其值會作為參數item_id傳遞到read_item視圖函數中。
4.2 路徑參數的類型
路徑參數有多種類型,如int 、str、float等
如上面的 item_id:int就是將路徑參數指定為int類型
- 注意:如果指定類型之后,會自動進行類型效驗,如果不符合會顯示一個HTTP錯誤頁。
我輸入http://127.0.0.1:8000/items/sd
因為sd 是字符串型,而不是int型。
4.3 指定路徑順序
有了上面的路徑參數,或許你會問了,
@app.get("/items/me")@app.get("/items/{item_id}")當我輸入http://127.0.0.1:8000/items/me會調用那個?
- 路徑是以順序進行判斷的,簡單來說就是上邊的那個放在上面就會調用那個。
五、 Query 查詢參數
當聲明不屬于路徑參數的其他函數參數時, FastAPI會將其自動解釋為Query參數,也就是查詢參數。Query參數就是**URL地址中“?”之后的一系列 value鍵值對,每組鍵值對用“&”分割開來。**這也是我們在網址中經常看到的。
5.1 聲明 Query 參數
Query 參數 是在視圖函數中聲明的:如
@app.get("/items/{item_id}")def read_item(item_id:int,q:str =None):return {"item_id":item_id,"q":q}- q:str =None 中 q 就是Query 參數。
5.2 設置Query 參數
Query 參數不是path 中固定的部分,它們是可選的,并且有默認值。
在上面的例子中,Query 參數 擁有默認值 q= None
如果訪問http://127.0.0.1:8000/items/1
得到
- 注意當參數沒有默認值的時候,那么這個參數就必須傳入。
六、Request Body 請求體
注意事項
創建數據模型
實現請求體總共包含三個步驟。
(1)定義模型。從pydantic中導入BaseModel
(2)創建模型。聲明模型需要一個類,且該類繼承BaseModel
from pydantic import BaseModelclass Item(BaseModel):name: str description: str = Noneprice: float tax: float = None和Query參數一樣:數據類型的屬性如果不是必須的話,可以擁有一個默認值或者是可選None。否則,該屬性就是必須的。
七、Header 請求頭參數
八、Form 表單數據
注意:async 是異步async/await功能。
九、操作MySQL
因為用到 ORM框架:SQLAlchemy。所以可以看下面這篇文章了解一下。
ORM
數據表模型
使用SQLAlchemy進行數據庫操作,其具體設置如下:
數據庫配置文件:
class Config:SECRET_KEY = 'mrsoft' #密鑰SQLALCHEMY_TRACK_MODIFICATIONS = True# 數據庫鏈接地址SQLALCHEMY_DATABASE_URL = "mysql+pymysql://root:andy123456@localhost/idiom?charset=utf8mb4"數據庫連接格式
dialect+driver://username:password@host:port/database- dialect:數據庫類型,比如mysql,sqlite,注意:一定要是小寫
- driver:是python對應的驅動,如果不指定,則會使用默認的驅動,比如MySQL默認驅動是MySQLdb
- username:數據庫用戶名
- password:數據庫密碼
- host:數據庫的域名
- port:數據庫監聽的端口,通常默認是3306
- database:連接的數據庫的名字
- 連接地址后面還可以加上查詢字符串來設定,如charset=utf8
連接數據庫文件
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmakerfrom fastapi_idiom.config import Config #創建引擎 engine = create_engine(Config.SQLALCHEMY_DATABASE_URL) #創建數據庫會話 SessionLocal = sessionmaker(autocommit= False,autoflush =False,bind = engine) #聲明基類,創建了一個ORM基類 Base = declarative_base()創建模型文件
from sqlalchemy import Column,Integer,String,DateTime from fastapi_idiom.models.database import Base from datetime import datetime#會員數據模型 #定義 User 類 class User(Base):__tanlename__ = "user" #定義表名# 定義屬性#在這個ORM模型中創建一些屬性,來跟表中的字段進行一一映射。這些屬性必須#是sqlalchemy給我們提供好的數據類型id = Column(Integer,primary_key=True,index=True)openid = Column(String(80))nickname = Column(String(100))avatar = Column(String(255))level = Column(Integer)addtime = Column(DateTime,index=True,default=datetime.now)def __repr__(self):#Python中這個_repr_函數,對應repr(object)這個函數,返回一個可以用來表示對象的可打印字符串:return '<User %r>'%self.nickname模型對象方法
為了實現代碼重用,需要將模型對象用到的方法寫入 一個文件中。
from datetime import datetimeimport sqlalchemy from fastapi_idiom.models.database import SessionLocalfrom .models import User,Gamedb = SessionLocal() #創建會話# 獲取用戶信息 def get_user(openid : str):return db.query(User).filter(User.openid == openid).first()#創建用戶 def create_user(openid ,nickname,avatar):db_user = User(openid = openid,nickname = nickname,avatar = avatar,level = 0,addtime = datetime.now())db.add(db_user)db.commit()db.refresh(db_user)return db_user詳細的SQLAlchemy使用可以參考這篇文章:
SQLAlchemy
- python前端學習-----Flask進階
- Flask實戰----做了一個簡易版CSDN
總結
以上是生活随笔為你收集整理的FastAPI ------框架基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ map通过值找键与通过键找值得方
- 下一篇: ORM MVC、模板引擎介绍(建议收藏)