先吹一波: 原来写接口可以这么简单!!! 简单到没朋友 。
中文官网:https://fastapi.tiangolo.com/zh/tutorial/header-params/
且天然支持异步处理。
自动生成API文档,
还说比肩NodeJs和Go 、这个我就没有具体测试了,有兴趣的可以自行尝试比较
直接上代码吧,一切的解释都是多余的。
Hello World !!
from fastapi import FastAPI,Form,Query,UploadFile,File,Request from pydantic import BaseModel,Field from typing import Optional,List import os,sys ‘‘‘ 虚拟环境切换: conda activate FastAPI FastAPI 程序启动 :uvicorn manger:app --port 7777 --reload ‘‘‘ app = FastAPI() @app.get(‘/‘) async def root(): # get 请求 return {‘message‘:‘Hello World!‘}
动态路径:
@app.get(‘/{test_id}‘) async def api_get_text(test_id:int): # get 请求 动态路径 return {‘data‘:test_id}
post:
@app.post(‘/user‘) async def api_post_text(data:dict): #Post 请求,json格式 return {‘data‘:data}
请求内容检测:
class detection(BaseModel): name:str age:int = 18 #默认值 sex:Optional[str] # null 类型 @app.post(‘/PostDetection‘) async def api_post_text(data:detection): #Post 请求内容检测 return {‘data‘:data}
请求内容多个主体检测:
class Mds(BaseModel): name: str age: int = 18 home: str height: Optional[str] class Mm(BaseModel): title: str phone: str = ‘huawei‘ @app.put("/PutTest/") async def PutTests(Mds:Mds,Mm:Mm,name:str,q: Optional[bool] = False): ret = {} if q: ret.update({"request_name":name}) if Mds.name: ret.update({"Name":Mds.name}) if Mds.height: ret.update({"height":Mds.height}) if Mm.title: ret.update({"Title":Mm.title}) return ret
From表单:
@app.post(‘/userFrom/‘) async def api_post_text(username: str = Form(...),password:str = Form(...)): # Post 请求 ,From 表单格式 return {‘username‘:username,"Password":password}
API内容代码直接体现:
class Posttest(BaseModel): test_name:str max_data:int = 10 class Config: # 手动定义接口返回值 示例内容 schema_extra = { "example":{ "name":"YCC", "data":{ "age":12, ‘sex‘:‘boy‘ } } } @app.post("/postTest/") async def test_posts(data:Posttest,name:str = Query(...,title="post test",example=‘phyger‘,max_length=5,alias=‘x-name‘,deprecated=True,description="test_description")): ‘‘‘ 这部分可直接在 接口文档内展示 Query 字段查询检验 title 接口文档字段注释 min_length 最短 max_length 最长 alias 变量别名 用于接收不合法参数名称 (接口请求时传递x-name ,接收到时会将x-name 匹配为name,设定后 只会匹配x-name 不匹配name) description 字段描述信息 example 示例参数 deprecated 接口废弃提示 ‘‘‘ return {"name":name,"data":data}
多层嵌套检测:
class TowOptionalData(BaseModel): townumber:int class OptionalData(BaseModel): name:str = Field(...,example=‘ccc‘) # 检测字段内自定义限制 userlist:List[str] # 列表内容类型限制 data:Optional[TowOptionalData] @app.post(‘/OptionalTset/‘) async def test_Optional(data:OptionalData): ‘‘‘ 多层嵌套类型检测 ‘‘‘ return {‘masage‘:"多层嵌套!!","data":data}
单个文件上传:
@app.post(‘/File/‘) async def File_upload(request:Request,files:UploadFile =File(...)): ‘‘‘ 文件对象默认是个列表 files.filename 获取文件名称 files.content_type 获取文件类型 ‘‘‘ path = R"F:\my_pro\file\py" newfile = files newpath = os.path.join(path,newfile.filename) try: res = await newfile.read() # print(len(res)/1024) with open(newpath, "wb") as f: f.write(res) rts = { "filename":file.filename, "filetype":file.content_type, "size":"%.2f KB"%(len(res)/1024) } return {‘code‘:0,‘data‘:rts} except Exception as e : msg = e return {"err_msg":e}
多文件上传:
@app.post(‘/FileList/‘) async def File_upload(request:Request,filelist:List[UploadFile] =File(...)): #多文件上传 ‘‘‘ 文件对象默认是个列表 files.filename 获取文件名称 files.content_type 获取文件类型 ‘‘‘ path = R"F:\my_pro\file\py" oklist = [] errlist = [] for file in filelist: try: newpath = os.path.join(path,file.filename) res = await file.read() with open(newpath, "wb") as f: f.write(res) rts = { "filename":file.filename, "FileType":file.content_type, "size":"%.2f KB"%(len(res)/1024) } oklist.append(rts) except Exception as e: errlist.append({‘name‘:file.filename,‘msg‘:e}) return {"code":200,"oklist":oklist,"errlist":errlist}
安排。。。
以后项目又多了一个选择。
附上API文档:
特别鸣谢:Python 测试和开发
原文:https://www.cnblogs.com/yc-c/p/14517909.html