本篇介绍常见的一些api使用场景
获取路径参数
www.baidu.com/user/123, 会获取到id是123
python
# 获取路径参数
@router.get("/user/{id}")
async def root(id):
return {"code": 200, "msg": f"用户{id}"}
获取查询字符串
www.baidu.com?id=xxx 即问号后面的参数
python
# 获取查询字符串
@router.get("/user")
async def user(id):
return {"code": 200, "msg": f"用户{id}"}
获取请求头信息
python
# 请求头
@router.get("/token")
async def token(id, token=Header(None)):
return {"code": 200, "msg": f"token:{token}"}
post参数获取
接收post请求的数据
python
# post参数获取
@router.post("/post")
def postbody(data=Body(None)):
return {"code": 200, "msg": f"username:{data.username}"}
多请求合并
这个api用get和post都会路由到这个地方处理
perl
# 多请求合并
@router.api_route("/mulreq", methods=["get", "post"])
def mulreq():
return "success"
流操作
下载文件需要返回文件流
csharp
# 流操作
@router.get("/zipfile")
async def zipfile():
Common.zipfile("./dao", "dao2")
url = "./dao2.zip"
return FileResponse(url, filename="dao2.zip")
图片下载和预览
先配置资源目录映射
less
app.mount("/img", StaticFiles(directory=Env.getPath(Env.HomeDir, "resources/img")))
csharp
@router.get("/avator")
def avator():
avator = "resources/img/1.webp"
# 预览图片
return FileResponse(avator)
# 下载图片
# return FileResponse(avator, filename="1.webp")
重定向
python
# 重定向
@router.get("/redirect")
async def redirect(id):
return RedirectResponse("/html", status_code=302)
redis使用
python
# 安装依赖
pip install walrus
from walrus import Database as RedisDatabase
db = RedisDatabase(host="localhost", port=6379)
rate = db.rate_limit("speedlimit", limit=5, per=60) # 每分钟只能调用5次
# 限流
@router.get("/com")
@rate.rate_limited(lambda request: request.client.host)
def com(request: Request):
return {"code": 200, "msg": "success"}
完整示例
python
import asyncio
import time
from typing import List
from fastapi import APIRouter, Request, Header, Body
from fastapi.responses import (
RedirectResponse,
FileResponse,
)
from util.base import Common
from laorm.stream import Field, sql, table
from laorm.PPA import PPA
from util.exception import exception
from util.response import AppResult
from pydantic import BaseModel
router = APIRouter(
prefix="/example",
tags=["示例代码"],
responses={404: {"description": "Not found"}},
)
# 获取路径参数
@router.get("/user/{id}")
async def root(id):
return {"code": 200, "msg": f"用户{id}"}
# 获取查询字符串
@router.get("/user")
async def user(id):
return {"code": 200, "msg": f"用户{id}"}
# 请求头
@router.get("/token")
async def token(id, token=Header(None)):
return {"code": 200, "msg": f"token:{token}"}
# post参数获取
@router.post("/post")
def postbody(data=Body(None)):
return {"code": 200, "msg": f"username:{data.username}"}
# 多请求合并
@router.api_route("/mulreq", methods=["get", "post"])
def mulreq():
return "success"
# 流操作
@router.get("/zipfile")
async def zipfile():
Common.zipfile("./dao", "dao2")
url = "./dao2.zip"
return FileResponse(url, filename="dao2.zip")
@router.get("/avator")
def avator():
avator = "resources/img/1.webp"
# 预览图片
return FileResponse(avator)
# 下载图片
# return FileResponse(avator, filename="1.webp")
# 重定向
@router.get("/redirect")
async def redirect(id):
return RedirectResponse("/html", status_code=302)
# 限流
@router.get("/com")
@rate.rate_limited(lambda request: request.client.host)
def com(request: Request):
return {"code": 200, "msg": "success"}