FastAPI(7)- get 请求 - 详解 Path
前言
- 上一篇讲了可以为查询参数添加额外的校验和元数据,Query 库:https://www.cnblogs.com/poloyy/p/15306809.html
- 这篇讲可以为路径查询添加额外的校验和元数据,Path 库
Path
可以为路径参数添加额外的校验和元数据,跟 Query 的参数是一毛一样的
元数据
Path 也可以添加元数据相关信息,这些信息将包含在生成的 OpenAPI 中,并由文档用户界面和外部工具使用
四种元数据参数
# 别名
alias: Optional[str] = None # 标题
title: Optional[str] = None # 描述
description: Optional[str] = None # 是否弃用
deprecated: Optional[bool] = None
实际代码
from fastapi import FastAPI, Path
from typing import Optional
import uvicorn app = FastAPI() # 元数据
@app.get("/items/{item_id}")
async def read_items(
item_id: Optional[str] = Path(
default=...,
min_length=2,
max_length=50,
regex="^菠萝$",
title="标题",
description="很长很长的描述",
deprecated=True,
)
):
return {"item_id": item_id}
校验成功的请求结果
校验失败的请求结果
查看 Swagger API 文档
重点
- 路径参数始终是必需的,因为它必须是路径的一部分
- 所以,Path 的 default 参数值必须设为 ...
元数据不应该使用 alias
因为路径参数并不能通过 参数名=value 的形式来传值,所以没有办法通过 alias = value 的方式给别名传值,最终将会报错
@app.get("/alias/{item_id}")
async def read_items(
item_id: Optional[str] = Path(
default=...,
alias="item_alias"
)
):
return {"item_id": item_id}
请求结果
查看 Swagger API 文档,并运行
直接在 Swagger API 文档上尝试运行也会报错,所以路径参数不要用别名哦!
函数参数排序问题
Python 会将 item_id: int = Path(...) 识别为默认参数,而 q: str 是位置参数,而位置参数不能在默认参数后面,所以爆红了
解决方案
在 Python 3.8 新除了仅限关键字参数:https://www.cnblogs.com/poloyy/p/15106522.html
@app.get("/item/{item_id}")
async def read_items(
*,
item_id: int = Path(...),
name: str):
return {"item_id": item_id, "name": name}
将 * 作为第一个参数,那么 * 后面的所有参数都会当做关键字参数处理,即使它们没有设置默认值(像 name)
正常传参的请求结果
数字类型校验
Query 和 Path 都可以添加数字校验,Query 文章并没有讲解数字校验,所以这里重点讲下
数字校验参数
# 大于
gt: Optional[float] = None # 大于等于
ge: Optional[float] = None # 小于
lt: Optional[float] = None # 小于等于
le: Optional[float] = None
实际代码
@app.get("/number/{item_id}")
async def read_items(
*,
item_id: int = Path(..., title="The IDsss", gt=10, le=20),
name: str = None):
return {"item_id": item_id, "name": name}
校验成功的请求结果
校验失败的请求结果
Query 和 Path 综合使用
@app.get("/path_query/{item_id}")
async def read_items(
*,
item_id: int = Path(..., description="path", ge=1, lt=5, example=1),
name: str,
age: float = Query(..., description="query", gt=0.0, le=10)):
return {"item_id": item_id, "age": age, "name": name}
正确传参的请求结果
注意
数字校验也可以适用于 float 类型的值
查看 Swagger API 文档
这里的 item_id 还加了个 example 参数,就是个示例值,所以在接口文档中会显示 Example
总结
- Query、Path 和后面会讲到的 Form、Cookie...等等,都是公共 Param 类的子类,但实际开发中并不会直接使用 Param 类
- 所有这些子类都共享相同的额外校验参数和元数据
Query 类
Path 类
Param 类
FastAPI(7)- get 请求 - 详解 Path的更多相关文章
- AJAX请求详解 同步异步 GET和POST
AJAX请求详解 同步异步 GET和POST 上一篇博文(http://www.cnblogs.com/mengdd/p/4191941.html)介绍了AJAX的概念和基本使用,附有一个小例子,下面 ...
- 详解path和classpath的区别
详解path和classpath的区别 path的作用 path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行JAVA文件,但必须把完整的路径写出来,如C:\Progr ...
- JavaEE基础(03):Http请求详解,握手挥手流程简介
本文源码:GitHub·点这里 || GitEE·点这里 一.Http协议简介 1.概念说明 HTTP超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,基于TCP/IP通信协议来传 ...
- 【Java_Spring】RestTemplate发HTTP请求详解
Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解) Spring RestTemplate提交时设置http header请求头 Spring之RestTempla ...
- GET请求与POST请求详解
一.GET请求 常用于获取服务器数据.常见的发起GET请求的方式有:url.href.src.form. 二.GET请求的格式 例子:index.php?userName=harry&pass ...
- 前后端数据交互(四)——fetch 请求详解
fetch 是 XMLHttpRequest 的升级版,使用js脚本发出网络请求,但是与 XMLHttpRequest 不同的是,fetch 方式使用 Promise,相比 XMLHttpReques ...
- FastAPI(6)- get 请求 - 详解 Query
可选参数 上一篇文章讲过查询参数可以不是必传的,可以是可选参数 from fastapi import FastAPI from typing import Optional import uvico ...
- FastAPI(54)- 详解 Request 请求对象
背景 前面讲了可以自定义 Response,那么这里就讲下请求对象 Request 可以通过 Request 来获取一些数据 获取请求基础信息 @app.get("/base") ...
- Android 网络请求详解
我们知道大多数的 Android 应用程序都是通过和服务器进行交互来获取数据的.如果使用 HTTP 协议来发送和接收网络数据,就免不了使用 HttpURLConnection 和 HttpClient ...
随机推荐
- 雪花算法ID在前端丢失精度解决方案
首先说一下背景,目前笔者的工作是物联网方面的,设备有对应的智慧运营平台,平台开发中建表的主键用的是Mybatis plus默认的雪花算法来生成的,也就是分布式系统比较常用的雪花ID,技术栈就是常用的S ...
- Servlet中的HttpServletResponse 类
HttpServletResponse 类的作用: 理解:顾名思义 就是响应客户端的内容, HttpServletResponse 类和 HttpServletRequest ...
- 连通图与Tarjan算法
引言 Tarjan算法是一个基于深度优先搜索的处理树上连通性问题的算法,可以解决,割边,割点,双连通,强连通等问题. 首先要明白Tarjan算法,首先要知道它能解决的问题的定义. 连通图 无向图 由双 ...
- 中文屋 Chinese room
中文屋 Chinese room 深夜了,假装有个bgm,虽然我真的有个bgm<中间人> 强烈安利,无敌好听,冰老师yyds 开始瞎侃 在经历了机器学习的洗礼以后,感觉人都升华了,本来对于 ...
- Qt项目简易开发原理及常见问题解决
一.资源下载地址 https://www.aliyundrive.com/s/jBU2wBS8poH 本项目路径:项目->免费->QtDev 注释:为了方便qt全功能开发,QtDev中包含 ...
- 北航面向对象OO第三单元——JML
简介 本单元借助JML(Java Modeling Language),训练了我们关于的"规格(specification)"的意识和思想 本单元代码难度较低,简单来讲就是给你规定 ...
- 一个极其朴素的目录扫描Python脚本
如果目录扫描工具被某些种类的waf拦截了,可以尝试(只是尝试,不是绝对能过)用脚本发出请求,具体功能看需求而定 原理...没啥原理,也没啥技术含量,相信大家都能看得懂的,nobody knows be ...
- STM32—DAC配置
文章目录 一.DAC介绍 二.主要寄存器说明 三.代码及配置 一.DAC介绍 ADC是模数转换器,可以将模拟电压转换位数字信号:DAC是数模转换器,可以将数字信号转换为模拟电压. STM32F103Z ...
- SpringBoot JPA查询映射到自定义实体类
和 SegmentFault上的文章(https://segmentfault.com/a/1190000021869465)一样, 都是俺账号 场景 举一个简单的栗子: 比如有一个User实体类 @ ...
- ConcurrentDictionary 并发字典
线程安全 Dictionary 本身是不支持线程安全的 线程的字典--ConcurrentDictionary 线程安全实现 写安全 以往线程安全我们通过Lock实现 比如通过lock一个全局的obj ...