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

文章目录

  • 1、路径操作
    • 1.路径操作装饰器
      • 1.tags 标签
      • 2.summary 接口描述的总结信息
      • 3.describe: 接口信息的详细描述
      • 4.response_description:响应描述
      • 5.deprecated:接口是否废弃,默认是False
    • 2.fastapi路由分发include_router
  • 2、请求与响应
    • 2.1、路径参数
      • (1)基本用法
      • (2)有类型的路径参数
      • (3)注意顺序
    • 2.2、查询参数(请求参数)

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

我们看下改为True的状态

@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的主要作用有:

  1. 类型检查,防止运行时出现参数、返回值类型不符。
  2. 作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
  3. 模块加入不会影响程序的运行不会报正式的错误,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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/412454.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web APIs 3 事件

Web APIs 3 事件 一、事件流事件捕获事件冒泡阻止冒泡解绑事件鼠标经过事件的区别两种注册事件的区别 二、事件委托阻止默认行为 三、其他事件① 页面加载事件② 元素滚动事件滚动到指定的坐标 ③ 页面尺寸事件 元素尺寸与位置① 元素在页面中的位置② 元素尺寸 一、事件流 事…

ABBYY FineReader16文档转换、PDF管理与文档比较功能介绍

ABBYY FineReader 16作为一款OCR和PDF一体化程序,其强大的功能使得文档处理变得简单高效。在众多功能中,文档转换、PDF管理和文档比较这三大功能尤为突出,成为了众多企业和个人用户的首选工具。 ABBYY Finereader 16-安装包下载如下&#xff…

【接口测试】POST请求提交数据的三种方式及Postman实现

1. 什么是POST请求? POST请求是HTPP协议中一种常用的请求方法,它的使用场景是向客户端向服务器提交数据,比如登录、注册、添加等场景。另一种常用的请求方法是GET,它的使用场景是向服务器获取数据。 2. POST请求提交数据的常见编…

YOLOv6、YOLOv7、YOLOv8网络结构图(清晰版)

承接上一篇博客:YOLOv3、YOLOv4、YOLOv5、YOLOx的网络结构图(清晰版)_yolox网络结构图-CSDN博客 1. YOLOv6网络结构图 2. YOLOv7网络结构图 3. YOLOv8网络结构图

一文讲清DTO、BO、PO、VO

DTO、BO、PO、VO是什么? 在后端开发中,比如传统的MVC架构和现在流行的DDD架构,经常会使用到下列几种对象的概念 DTO (Data Transfer Object) 数据传输对象: DTO设计模式用于将数据从服务端传输到客户端,或者在不同的…

【SVN】使用TortoiseGit删除Git分支

使用TortoiseGit删除Git分支 前言 平时我在进行开发的时候,比如需要开发一个新功能,这里以蘑菇博客开发服务网关-gateway功能为例 一般我都会在原来master分支的基础上,然后拉取一个新的分支【gateway】,然后在 gateway分支上进…

数据安全-动态加密(不同敏感字段使用不同的加密算法-MySQL、Oracle版本)

动态数据加密 动态加密(也称实时加密,透明加密等,其英文名为encrypt on-the-fly),是指数据在使用过程中自动对数据进行加密或解密操作,无需用户的干预,合法用户在使用加密的文件前,…

天翼云登录参数JavaSrcipt逆向

天翼云登录参数 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目标网站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目标参数 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四个参数 …

【摸鱼日常】使用Docker部署2048小游戏

一、本次实践介绍 ​1. 本次实践简介 本次实践部署环境为个人测试环境,快速使用docker部署2048小游戏。 rootWellDone:/home/goodjob# uname -aLinux WellDone 6.5.0-14-generic #14~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Nov 20 18:15:30 UTC 2 x86_64 x86_64…

从零开始手写mmo游戏从框架到爆炸(二十四)— 装备系统二

导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 本章主要是补充装备工厂,增加根据野怪等级和品质获得装备的方法: 增加的代码如下- EquipmentFactory: public static Equipment createEquipment(Monste…

pyspark分布式部署随机森林算法

前言 分布式算法的文章我早就想写了,但是一直比较忙,没有写,最近一个项目又用到了,就记录一下运用Spark部署机器学习分类算法-随机森林的记录过程,写了一个demo。 基于pyspark的随机森林算法预测客户 本次实验采用的…

目标检测-Transformer-ViT和DETR

文章目录 前言一、ViT应用和结论结构及创新点 二、DETR应用和结论结构及创新点 总结 前言 随着Transformer爆火以来,NLP领域迎来了大模型时代,成为AI目前最先进和火爆的领域,介于Transformer的先进性,基于Transformer架构的CV模型…

240Hz高刷电竞显示器 - HKC VG253KM

🎉🎉🎉 各位电竞爱好者们,今天给大家带来一款神秘武器,一款能够让你在游戏中大展拳脚的高刷电竞显示器 - HKC VG253KM!🔥🔥🔥 这款显示器,哎呀,真…

【Vue3】插槽使用和animate使用

插槽使用 插槽slot匿名插槽具名插槽插槽作用域简写 动态插槽transition动画组件自定义过渡class类名如何使用animate动画库组件动画生命周期appear transition- group过渡列表 插槽slot 插槽就是子组件中提供给父组件使用的一个占位符父组件可以在这个占位符智能填充任何模板代…

深度学习 精选笔记(3)线性神经网络-线性回归

学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…

spring boot 集成科大讯飞星火认知大模型

首先到官网https://console.xfyun.cn/services/aidoc申请key 一、安装依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…

记录 | docker权限原因导致service ssh start失败

【报错】 容器内启 ssh server 报错 有两个错&#xff1a; &#xff08;1&#xff09;/etc/ssh/sshd_host_rsa_key 权限太高&#xff1b; &#xff08;2&#xff09;/run/sshd用户组不为 root 解决方法&#xff1a; 方法一&#xff1a; 各自容器内对/etc/ssh/sshd_host_r…

41.仿简道云公式函数实战-数学函数-SUMIF

1. SUMIF函数 SUMIF 函数可用于计算子表单中满足某一条件的数字相加并返回和。 2. 函数用法 SUMIF(range, criteria, [sum_range]) 其中各参数的含义及使用方法如下&#xff1a; range&#xff1a;必需&#xff1b;根据 criteria 的条件规则进行检测的判断字段。支持的字段…

Spring篇----第九篇

系列文章目录 文章目录 系列文章目录前言一、@Qualifier 注解有什么用?二、@RequestMapping 注解有什么用?三、spring DAO 有什么用?四、列举 Spring DAO 抛出的异常。前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…

精益思维引领AI创新浪潮:从理念到实践的蜕变!

在人工智能&#xff08;AI&#xff09;飞速发展的今天&#xff0c;精益思维作为一种追求卓越、持续改进的管理哲学&#xff0c;正逐渐成为推动AI创新的重要动力。本文&#xff0c;天行健咨询将探讨精益思维如何与AI创新相结合&#xff0c;以及这种结合如何推动科技进步和社会发…