一、安裝和基本運(yùn)行訪問
官方示例代碼
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
運(yùn)行命令:uvicorn test:app --reload
注意:運(yùn)行命令app前面那個(gè)是文件位置,官方的文件名叫main,要以實(shí)際的文件名為準(zhǔn),不然找不到app
二、post請(qǐng)求和json參數(shù)嵌套
1、post請(qǐng)求 寫法一:一層參數(shù)
class Hero(BaseModel):
q:str
w:str
e:str
# 可以為不傳這個(gè)自動(dòng)也可以傳字符串,不傳這個(gè)字段時(shí)該字段默認(rèn)值為None
r:Union[str, None] = None
@app.post('/ya_suo')
def ya_suo(hero:Hero):
print(hero.r)
#取值
if hero.r==None:
return '大招都沒有'
return hero
測(cè)試無r參數(shù)情況測(cè)試有r參數(shù)情況
2、post請(qǐng)求 寫法二:參數(shù)嵌套
2.1、錯(cuò)誤寫法
@app.post('/ti_mo')
def ti_mo(q:str,w:str,e:str,r:Union[str, None] = None):
a={"q技能":q,"w技能":w,"e技能":e,"r技能":r}
return a
報(bào)錯(cuò)了
2.2、正確寫法
這樣才行q:str,這種只用于路徑參數(shù),因?yàn)閞可以為空或者不寫,可以不用是路徑參數(shù)
@app.post('/ti_mo1/{cd}')
def ti_mo1(cd:str,r:Union[str, None] = None):
a={"技能cd":str(cd)+'s',"r技能":r}
return a
@app.post('/ti_mo1/{cd}')
def ti_mo1(cd:str,r:Union[str, None] = None):
a={"技能cd":str(cd)+'s',"r技能":r}
return a
2.3、嵌套多個(gè)請(qǐng)求參數(shù)(不明白的話看下面的postman的請(qǐng)求參數(shù)就懂了)
#這2個(gè)就直接用官方寫的了
class Item(BaseModel):
name: str
description: Union[str, None] = None
price: float
tax: Union[float, None] = None
class User(BaseModel):
username: str
full_name: Union[str, None] = None
@app.post('/q_t/{id}')
def q_t(id:int,item:Item,user:User):
return {'id':id,'item':item,'user':user}
2.4、嵌套單個(gè)請(qǐng)求參數(shù)(細(xì)節(jié)max)(不明白的話看下面的postman的請(qǐng)求參數(shù)就懂了~)
#只有嵌套單個(gè)請(qǐng)求體的話請(qǐng)求參數(shù)和多個(gè)是有很大區(qū)別的
@app.post('/q_t1/{id}')
def q_t1(id:int,user:User):
return {'id':id,'user':user}
注意:重點(diǎn)在發(fā)起請(qǐng)求的時(shí)候
希望請(qǐng)求參數(shù)格式
{
"user": {
"username": "dave",
"full_name": "Dave Grohl"
}
}
可是現(xiàn)在會(huì)報(bào)錯(cuò)
要這樣才會(huì)成功,可是這不是我們想要的結(jié)果
按照官方的解決辦法,在我這有點(diǎn)問題
告訴我確實(shí)一個(gè)參數(shù)(可能版本有啥問題把)
缺少我就先補(bǔ)上這個(gè)參數(shù)試試,發(fā)現(xiàn)就能正常使用了
@app.post('/q_t1/{id}')
def q_t1(id:int,user:User= Body(...,embed=True)):
return {'id':id,'user':user}
最終測(cè)試
三、請(qǐng)求體 - 字段Field
#字段Field
class Item(BaseModel):
name: str
description: Union[str, None] = Field(
default='默認(rèn)值', title="這是一個(gè)商品", max_length=300
)
price: float = Field(gt=0, description="商品價(jià)格必須大于0")
tax: Union[float, None] = None
@app.post("/items/{item_id}")
def update_item(item_id: int, item: Item = Body(...,embed=True)):
results = {"item_id": item_id, "item": item}
return results
gt=0的意思,看源碼字段的解釋
測(cè)試商品價(jià)格小于等于0的情況
測(cè)試正常情況
四、請(qǐng)求參數(shù)字段使用字典列表集合嵌套
#請(qǐng)求參數(shù)字段使用字典列表集合嵌套
class Image(BaseModel):
#檢查是否為有效的url
url: HttpUrl
name: str
class Item(BaseModel):
name: str
# 參數(shù)格式:字符串或者為空不傳這個(gè)字段
description: Union[str, None] = None
price: float
# 參數(shù)格式:小數(shù)或者為空不傳這個(gè)字段
tax: Union[float, None] = None
tags: Set[str] = set()
#參數(shù)格式:列表里面包含字典或者為空不傳這個(gè)字段
images: Union[List[Image], None] = None
@app.post('/qtt/{id}')
def qtt(id:int,item:Item):
return {"id": id, "item": item}
字段設(shè)置說明
測(cè)試結(jié)果和請(qǐng)求參數(shù):使用 tags: Set[str] = set(),我重復(fù)的寫了一個(gè)"metal",,被去重了,列表嵌套字典
五、返回結(jié)果限制返回字段
#創(chuàng)建一個(gè)有明文密碼的輸入模型和一個(gè)沒有明文密碼的輸出模型,讓密碼不返回
class UserRequest(BaseModel):
username: str
password: str
class UserResponse(BaseModel):
username: str
#response_model=UserResponse 設(shè)置返回模型的字段,返回結(jié)果會(huì)過濾掉未在輸出模型中聲明的字段數(shù)據(jù)
@app.post("/user", response_model=UserResponse)
def create_user(user: UserRequest):
#只會(huì)返回username信息
return user
返回模型的字段不能出現(xiàn)請(qǐng)求模型字段沒有的字段
測(cè)試,沒有返回密碼字段
六、異常信息處理
#基本使用異常信息
e=[1,2,4,5,6,9]
@app.get('/err/{id}')
def err(id:int):
if id not in e:
raise HTTPException(status_code=404,detail='id不存在')
return {'id':id}
輸入id為3,不存在的結(jié)果
輸入id為1,存在的結(jié)果
七、接口文檔
http://127.0.0.1:8000/docs
八、全局依賴設(shè)置全局token,name在header里面校驗(yàn),獲取header的信息作為變量使用
from fastapi import Depends, FastAPI, Header, HTTPException
#token: str = Header(...) header信息使用
def verify_token(token: str = Header(...)):
if token != "em123dca":
raise HTTPException(status_code=400, detail="Token 無效")
#方法名字沒啥要求
def name(name: str = Header(...)):
if name != "lcf":
raise HTTPException(status_code=400, detail="該用戶沒有權(quán)限訪問")
#全局依賴
app = FastAPI(dependencies=[Depends(verify_token), Depends(name)])
@app.get("/header_token")
#可以這樣獲取header的信息(做一些token信息解析),應(yīng)該有其他方法的,沒找到,誰找到告訴我一下
def get_token(name: str = Header(...),token: str = Header(...)):
return {'name':name,'token':token}
測(cè)試:正確的token和有權(quán)限的name測(cè)試:正確的token和無權(quán)限的name
測(cè)試:錯(cuò)誤的token和有權(quán)限的name
都錯(cuò)誤的話先校驗(yàn)token的,因?yàn)榉椒▽懺谇懊?br>
九、啟動(dòng)服務(wù)器的第二種方式,讓同局域網(wǎng)下用戶可以訪問
查詢下自己的局域網(wǎng)ip地址
python查詢ip地址
cmd查詢ip地址
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def s():
return '局域網(wǎng)測(cè)試12'
if __name__ == '__main__':
import uvicorn
uvicorn.run(app='test2:app',host='192.168.11.177',port=8001, reload=True)
文章來源:http://www.zghlxwxcb.cn/news/detail-404514.html
測(cè)試
優(yōu)化下啟動(dòng)代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-404514.html
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@time : 2022/6/21
@Author : LL
@File : test2.py
'''
from fastapi import FastAPI
def get_ip():
import socket
res = socket.gethostbyname(socket.gethostname())
return res
app = FastAPI()
@app.get("/")
def s():
return '局域網(wǎng)測(cè)試12'
if __name__ == '__main__':
import uvicorn
#app='test2:app' 文件位置:app
uvicorn.run(app='test2:app',host=get_ip(),port=8001, reload=True)
到了這里,關(guān)于python fastapi 入門教程,每個(gè)案例都使用postman進(jìn)行測(cè)試寫的接口的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!