第一个FastAPI
from fastapi import FastAPI
# 创建API实例
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello FastAPI on PyCharm Community"}
路由
import uvicorn
from fastapi import FastAPI
# 创建API实例
app = FastAPI()
@app.get("/")
async def get_hello():
return "hello world"
参数简介和路径参数
import uvicorn
from fastapi import FastAPI
# 创建API实例
app = FastAPI()
# 路径参数
@app.get("/book/{id}")
async def get_book(id: int):
return {"id":id,"title":f"这是第{id}本书"}
路径参数_Path类型注解
import uvicorn
from fastapi import FastAPI,Path
# 创建API实例
app = FastAPI()
# 路径参数_path类型注解
@app.get("/school/{id}")
async def get_school(id: int = Path(...,gt=0,lt=100,description="查询学校的接口")):
return {"id":id,"title":f"这是第{id}个学校"}
# 需求,查找书籍的作者,路径参数 name,长度范围 2 - 10
@app.get("/user/{id}")
async def get_name(name: str = Path(...,min_length=2,max_length=10)):
return {"msg": f"这是 {name}的信息"}
查询参数和Query类型注解
import uvicorn
from fastapi import FastAPI,Query
# 创建API实例
app = FastAPI()
# 查询参数和Query类型注解
# http://www.baidu.com?skip=&limit=&
@app.get("/news/news_list")
async def get_news_list(skip: int = Query(0,description="跳过的记录数",lt=100),
limit: int = Query(10,description="返回的记录数")
):
return {"skip":skip,"limit":limit}
请求体参数
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
# 创建API实例
app = FastAPI()
# 请求体参数
# 注册:用户名和密码 -> str
class User(BaseModel):
username: str
password: str
@app.post("/register")
async def register(user: User):
return user
请求体参数-Field类型注解
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel,Field
# 创建API实例
app = FastAPI()
# 请求体参数Field类型注解
# 注册:用户名和密码 -> str
class User(BaseModel):
username: str = Field("张三",min_length=2,max_length=10,description="用户名,长度要求2-10个字")
password: str = Field(min_length=3,max_length=20)
@app.post("/register")
async def register(user: User):
return user
响应参数-JSON格式
import uvicorn
from fastapi import FastAPI
# 创建API实例
app = FastAPI()
# 响应格式-JSON
@app.get("/response_json")
async def get_response_json():
return {"message":"hello world"}
响应参数-HTML格式
import uvicorn
from fastapi import FastAPI
from starlette.responses import HTMLResponse, FileResponse
# 创建API实例
app = FastAPI()
# 响应格式-HTML
@app.get("/response_html",response_class=HTMLResponse)
async def get_html():
return "<h1>这是一级标题</h1>"
响应参数-文件格式
# 响应格式-文件类型
import uvicorn
from fastapi import FastAPI
from starlette.responses import HTMLResponse, FileResponse
# 创建API实例
app = FastAPI()
# 返回一张图片内容
@app.get("/response_file")
async def get_file():
path = "./files/1.jpeg"
return FileResponse(path)
自定义响应格式
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel,Field
from starlette.responses import HTMLResponse, FileResponse
# 创建API实例
app = FastAPI()
# 需求:新闻接口 -> 响应数据格式 id、title、content
class News(BaseModel):
id: int
title: str
content: str
@app.post("/news/{id}",response_model=News)
async def get_news(id: int):
return {
"id":id,
"title":f"这是第{id}本书",
"content":"这是一本好书"
}
异常响应处理
import uvicorn
from fastapi import FastAPI,HTTPException
# 创建API实例
app = FastAPI()
# 异常响应处理
# 需求:按id新闻查询 -> 1 - 6
@app.get("/get/exc/news/{id}")
async def get_exc_news(id: int):
id_list = [1,2,3,4,5,6]
if id not in id_list:
raise HTTPException(status_code=404,detail="您查找的新闻不存在")
return {"id":id}