Fastapi进阶用法,路径参数,路由分发,查询参数等详解

简介: Fastapi进阶用法,路径参数,路由分发,查询参数等详解

1、路径操作

1.路径操作装饰器

fastapi支持各种请求方式:

@app.get()

@app.post()

@app.put()

@app.patch()

@app.delete()

@app.options()

@app.head()

@app.trace()

import uvicorn

from fastapi import FastAPI

app = FastAPI()


@app.get("/get")
def get_test():
    return {"method": "get方法"}


@app.post("/post")
def post_test():
    return {"method": "post方法"}


@app.put("/put")
def put_test():
    return {"method": "put方法"}


@app.delete("/delete")
def delete_test():
    return {"method": "delete方法"}



if __name__ == '__main__':
    #注意,run的第一个参数 必须是文件名:应用程序名
    uvicorn.run("路径操作:app", port=8080,  reload=True)


使用postman测试

当然也可以通过fastapi提供的docs文档测试

关于路径操作装饰器参数:


1.tags 标签

这个是展示在每个接口上面的信息

@app.post(“/items”,tags=[‘这是items的测试接口’])

def items():

return {“method”: “items数据”}


2.summary 接口描述的总结信息


@app.post(“/items”,tags=[‘这是items的测试接口’],
summary=“this is items测试 summary”,
def items():
return {“method”: “items数据”}
)


3.describe: 接口信息的详细描述

@app.post(“/items”,tags=[‘这是items的测试接口’],
summary=“this is items测试 summary”,
description=“this is items测试 description…”,

def items():

return {“method”: “items数据”}


4.response_description:响应描述

@app.post(“/items”,tags=[‘这是items的测试接口’],

summary=“this is items测试 summary”,

description=“this is items测试 description…”,

response_description=“this is items测试 response_description…”,

deprecated=True


5.deprecated:接口是否废弃,默认是False

@app.post(“/items”,tags=[‘这是items的测试接口’],
summary=“this is items测试 summary”,
description=“this is items测试 description…”,
response_description=“this is items测试 response_description…”,
deprecated=True
def items():
return {“method”: “items数据”}

2.fastapi路由分发include_router

在FastAPI中,我们可以使用include_router函数将一个或多个路由添加到应用程序中。

APIRouter 就给我们提供了在多个文件中注册路由的功能。

比如我们某个项目apps

里面不同功能代码放在不同的包app01,app02等


每个功能都有自己的路由,我们放在urls.py中

路由都是通过APIRouter()来注册的

from fastapi import APIRouter

shop = APIRouter()


@shop.get("/food")
def shop_food():
    return {"shop": "food"}


@shop.get("/bed")
def shop_food():
    return {"shop": "bed"}


from fastapi import APIRouter

user = APIRouter()


@user.post("/user/login")
def user_login():
    return {"user": "login"}


@user.post("/user/reg")
def user_reg():
    return {"user": "reg"}


在与apps文件夹同级的main.py中,我们来写总路由

from fastapi import FastAPI  # FastAPI 是一个为你的 API 提供了所有功能的 Python 类。
import uvicorn

from apps.app01.urls import shop
from apps.app02.urls import user

#创建应用程序,app是应用程序名
app = FastAPI()  # 这个实例将是创建你所有 API 的主要交互对象。这个 app 同样在如下命令中被 uvicorn 所引用

#在这里进行路由分发,prefix是路由前缀,不用在子路由里面写
app.include_router(shop, prefix="/shop", tags=["第一章节:商城接口", ])
app.include_router(user, prefix="/user", tags=["第二章节:用户中心接口", ])


if __name__ == '__main__':
    #注意,run的第一个参数 必须是文件名:应用程序名
    uvicorn.run("main:app", port=8080,  reload=True)

我们看下docs文档

不同功能的路由分开了,这样比较简明扼要

测试下,也能拿到数据


2、请求与响应

2.1、路径参数

(1)基本用法

之前我们写的案例里面的请求路径参数都是写死的,但是生产中,我们经常需要动态的传参,怎么实现呢

以使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量":

@app.get(“/user/{user_id}”)
def get_user(user_id):
print(user_id, type(user_id))
return {“user_id”: user_id}

路径参数 user_id 的值将作为参数 user_id 传递给你的函数。

实战:

from fastapi import FastAPI  # FastAPI 是一个为你的 API 提供了所有功能的 Python 类。
import uvicorn

#创建应用程序,app是应用程序名
app = FastAPI()  # 这个实例将是创建你所有 API 的主要交互对象。这个 app 同样在如下命令中被 uvicorn 所引用

#异步的请求参数,函数加上async
@app.get("/user/{user_id}")
async def get_user(user_id):
    return {"user_id": user_id}


@app.get("/article/{article_id}")
async def get_article(article_id):
    return {"article": article_id}


if __name__ == '__main__':
    #注意,run的第一个参数 必须是文件名:应用程序名
    uvicorn.run("路径参数:app", port=8080,  reload=True)

get请求访问

(2)有类型的路径参数

你可以使用标准的 Python 类型标注为函数中的路径参数声明类型。

自python3.5开始,PEP484为python引入了类型注解(type hints),typing的主要作用有:


类型检查,防止运行时出现参数、返回值类型不符。

作为开发文档附加说明,方便使用者调用时传入和返回参数类型。

模块加入不会影响程序的运行不会报正式的错误,pycharm支持typing检查错误时会出现黄色警告。

type hints 主要是要指示函数的输入和输出的数据类型,数据类型在typing 包中,基本类型有str list dict等等,

Union 是当有多种可能的数据类型时使用,当某个字段不止一个数据类型时,比如函数有可能根据不同情况有时返回str或返回list,那么就可以写成Union[list, str]

Optional 是Union的一个简化, 当 数据类型中有可能是None时,比如有可能是str也有可能是None,则Optional[str], 相当于Union[str, None]

使用Union,Optional需要导包
from typing import Union
from typing import Optional

#路径函数中不属于路径参数的其它参数,都属于查询参数
async def get_user(kd,xl:Union[str,None]=None,gj:Optional[str]=None):
#将查询结果返回
return {“kd”: kd,
“xl”:xl,
“gj”:gj
}

docs文档查看

@app.get(“/user/{user_id}”)
def get_user(user_id: int):
print(user_id, type(user_id))
return {“user_id”: user_id}

在这个例子中,user_id 被声明为 int 类型。

此时去请求,得到的就是int类型的响应数据

但是,此时要,做了限制后,url输入时要输入指定类型数据,否则转换失败会报错

(3)注意顺序


在创建路径操作时,你会发现有些情况下路径是固定的。


比如 /users/me,我们假设它用来获取关于当前用户的数据.


然后,你还可以使用路径 /user/{username} 来通过用户名 获取关于特定用户的数据。


由于路径操作是按顺序从上到下依次运行的,你需要确保路径 /user/me 声明在路径 /user/{username}之前:

@app.get(“/user/me”)
async def read_user_me():
return {“username”: “the current user”}

@app.get(“/user/{username}”)
async def read_user(username: str):
return {“username”: username}

否则,/user/{username}的路径还将与/user/me 相匹配,认为自己正在接收一个值为 “me” 的 username 参数。

走的是上面/user/username的逻辑

所以,一般把动态路径放下面


2.2、查询参数(请求参数)

路径函数中声明不属于路径参数的其他函数参数时,它们将被自动解释为"查询字符串"参数,就是 url? 之后用&分割的 key-value 键值对。

from fastapi import FastAPI  # FastAPI 是一个为你的 API 提供了所有功能的 Python 类。
import uvicorn

#创建应用程序,app是应用程序名
app = FastAPI()  # 这个实例将是创建你所有 API 的主要交互对象。这个 app 同样在如下命令中被 uvicorn 所引用

#异步的请求参数,函数加上async
@app.get("/user")
#路径函数中不属于路径参数的其它参数,都属于查询参数
async def get_user(kd,xl,gj):
    #将查询结果返回
    return {"kd": kd,
            "xl":xl,
            "gj":gj}




if __name__ == '__main__':
    #注意,run的第一个参数 必须是文件名:应用程序名
    uvicorn.run("路径参数:app", port=8080,  reload=True)


看下docs文档

测试,发送请求

看下url里面,就有了查询参数

也可以路径参数与查询参数共存

@app.get(“/user/{kd}”) #路径参数与查询参数共存
#路径函数中不属于路径参数的其它参数,都属于查询参数
async def get_user(kd,xl,gj):
#将查询结果返回
return {“kd”: kd,
“xl”:xl,
“gj”:gj
}

文档中查看,kd成了路径参数,其他两个是查询参数

发送请求,我们看到kd位置不再是查询参数,而是路径参数


上面的查询参数,都是必填的,有时我们需要有些事必填,有些可以有默认值,该怎么处理呢?

我们可以在查询参数定义时,给个默认值,当用户不输入时,可以默认是None,或其他默认值

#异步的请求参数,函数加上async
@app.get(“/user/”) #路径参数与查询参数共存
#路径函数中不属于路径参数的其它参数,都属于查询参数
async def get_user(kd,xl=None,gj=None):
#将查询结果返回
return {“kd”: kd,
“xl”:xl,
“gj”:gj
}

请求,当用户不输入时,返回None



相关文章
|
数据采集 JSON JavaScript
全面拥抱FastApi —三大参数及验证
全面拥抱FastApi —三大参数及验证
|
4月前
|
开发框架 JSON API
Python中FastAPI项目使用 Annotated的参数设计
Python中FastAPI项目使用 Annotated的参数设计
|
4月前
|
API 开发者 Python
FastAPI系列 4 -路由管理APIRouter
本文是FastAPI系列教程的第四部分,介绍了如何使用APIRouter进行路由管理,通过示例展示了将应用程序功能拆分到不同的模块和文件中,创建用户和书籍的API路由,以及在FastAPI主应用中包含这些路由的方法,并提供了运行结果和API交互文档的截图。
|
网络安全 Windows
基于fastapi实现6个接口(token拦截, 2个业务流程,接口参数依赖校验)已经通过postman测试,记录部署服务器和windows,用于pytest接口自动化框架的接口测试对象
基于fastapi实现6个接口(token拦截, 2个业务流程,接口参数依赖校验)已经通过postman测试,记录部署服务器和windows,用于pytest接口自动化框架的接口测试对象
|
机器学习/深度学习 开发框架 前端开发
FastAPI第一天---环境搭建以及路由
FastAPI第一天---环境搭建以及路由
518 0
FastAPI第一天---环境搭建以及路由
|
前端开发 中间件 API
FastAPI第二天---参数校验
FastAPI第二天---参数校验
237 0
FastAPI第二天---参数校验
|
前端开发 开发者
FastApi-19-高级用法
FastApi-19-高级用法
403 0
|
NoSQL 测试技术 Redis
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
|
存储 测试技术 数据安全/隐私保护
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
下一篇
DataWorks