项目描述
上传时间
浏览人数
安装fastapipip install fastapi安装uvicorn (生产环境)pip install uvicorn[standard]
import uvicorn # 超快速ASGI服务器
from fastapi import FastAPI
app = FastAPI()
@app.get("/") # 路由
def read_root():
return {"Hello": "World"}
if __name__ == '__main__':
uvicorn.run(app, host="127.0.0.1", port=8002) # 访问接口
import uvicorn
from fastapi import FastAPI, routing
async def main():
return {"main": "main"}
async def test():
return {"test": "test"}
router = [
routing.APIRoute("/", endpoint=main, methods=["get","post"]),
routing.APIRoute("/test/", endpoint=test, methods=["get","post"])
]
app = FastAPI(routes=router)
if __name__ == '__main__':
uvicorn.run(app=app, host="127.0.0.1", port=8003)
官方: 如果你不清楚你函数里的调用是否异步,那就定义为普通函数。因为它可以采用多线程的方式解决.
反之,定义了async函数,里面却是同步的调用(第一个函数) 执行非常的慢.
FastApi类似Flask 依赖Jinja2语法
在函数当前文件夹新建一个templates 用于存储html文件
from fastapi import FastAPI
import uvicorn
from starlette.templating import Jinja2Templates
from starlette.requests import Request
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/")
async def home(request: Request):
return templates.TemplateResponse('home.html', {"request": request})
# templates.TemplateResponse 与 flask rander_template类似,会自动从当前文件夹的下的templates目录寻找对应的html文件, request从前端{{request}}就可以接取到了
if __name__ == '__main__':
uvicorn.run(app, host="127.0.0.1", port=8002)
项目重启
uvicorn main:app --reload
--reload:让服务器更新代码后重新启动
交互式api文档
在接口后加入/docs 即可连接
api文档升级
在接口后加入/redoc 即可连接
*让用户可以和接口之间进行交互
fastapi中函数内的参数是可以规定类型的
例如:
def main(test: int): # test参数必须为int类型,也可以规定为float str类型
return {"test": test}
# 如果参数传递一个不是规定的值
http://127.0.0.1:8003/test/abc <--传递的str类型
{ # 提示参数错误, value 必须是integer类型
"detail": [
{
"loc": [
"path",
"item_id"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
}
/files/{file_path:path}
结尾部分的 :path
说明该参数应匹配任意的路径
你可能会需要参数包含 /home/johndoe/myfile.txt
,以斜杠(/
)开头。
在这种情况下,URL 将会是 /files//home/johndoe/myfile.txt
,在files
和 home
之间有一个双斜杠(//
)
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):
# 限定参数必须是ModelName枚举中的
if model_name == ModelName.alexnet:# 枚举判断方法1
return {"model_name": model_name}
if model_name.value == "lenet":# 枚举判断方法2
return {"model_name": model_name}
return {"model_name": model_name, "message": "Have some residuals"}
将已经存在的值存在class类中,这个类中存储的必须是字符串, 通过枚举判断来输出指定的值
从 body JSON 里获取参数, 这里说一下从传统的 Form 表单里获取数据(application/x-www-form-urlencoded
/multipart/form-data
)
想要从 Form 中获取数据,需要导入 Form 模块, 并且安装 python-multipart
包
from fastapi import FastAPI, Form
@app.post("/login")
async def login(*, name: str = Form(...), pwd: str = Form(...)): # 函数的接受参数第一个是 * 代表此函数只接受关键字传参
# Form(...) 必写
return {
"name": name,
"pwd": pwd
}