前言

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的更多相关文章

  1. AJAX请求详解 同步异步 GET和POST

    AJAX请求详解 同步异步 GET和POST 上一篇博文(http://www.cnblogs.com/mengdd/p/4191941.html)介绍了AJAX的概念和基本使用,附有一个小例子,下面 ...

  2. 详解path和classpath的区别

    详解path和classpath的区别 path的作用 path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行JAVA文件,但必须把完整的路径写出来,如C:\Progr ...

  3. JavaEE基础(03):Http请求详解,握手挥手流程简介

    本文源码:GitHub·点这里 || GitEE·点这里 一.Http协议简介 1.概念说明 HTTP超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,基于TCP/IP通信协议来传 ...

  4. 【Java_Spring】RestTemplate发HTTP请求详解

    Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解) Spring RestTemplate提交时设置http header请求头 Spring之RestTempla ...

  5. GET请求与POST请求详解

    一.GET请求 常用于获取服务器数据.常见的发起GET请求的方式有:url.href.src.form. 二.GET请求的格式 例子:index.php?userName=harry&pass ...

  6. 前后端数据交互(四)——fetch 请求详解

    fetch 是 XMLHttpRequest 的升级版,使用js脚本发出网络请求,但是与 XMLHttpRequest 不同的是,fetch 方式使用 Promise,相比 XMLHttpReques ...

  7. FastAPI(6)- get 请求 - 详解 Query

    可选参数 上一篇文章讲过查询参数可以不是必传的,可以是可选参数 from fastapi import FastAPI from typing import Optional import uvico ...

  8. FastAPI(54)- 详解 Request 请求对象

    背景 前面讲了可以自定义 Response,那么这里就讲下请求对象 Request 可以通过 Request 来获取一些数据 获取请求基础信息 @app.get("/base") ...

  9. Android 网络请求详解

    我们知道大多数的 Android 应用程序都是通过和服务器进行交互来获取数据的.如果使用 HTTP 协议来发送和接收网络数据,就免不了使用 HttpURLConnection 和 HttpClient ...

随机推荐

  1. Linux无法下载GCC

    Linux:ping百度ping不通 因为作业需要今天使用Linux下载GCC编译器,却发生了不可预知的错误: Errors during downloading metadata for repos ...

  2. 第4篇-JVM终于开始调用Java主类的main()方法啦

    在前一篇 第3篇-CallStub新栈帧的创建 中我们介绍了generate_call_stub()函数的部分实现,完成了向CallStub栈帧中压入参数的操作,此时的状态如下图所示. 继续看gene ...

  3. linux基础操作命令合集(一)

    linux基础操作命令合集(一) 目录 linux基础操作命令合集(一) 一.命令行提示符 二.切换用户 三.主机名称命令 3.1.临时设置主机名 3.2.永久设置主机名 四.查看系统版本 五.网卡相 ...

  4. 图 邻接表 邻接矩阵 BFS生成树 DFS生成树

  5. vue 快速入门 系列 —— vue-cli 下

    其他章节请看: vue 快速入门 系列 Vue CLI 4.x 下 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...

  6. [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader

    [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader 目录 [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader 0x00 摘要 0x01 ...

  7. Shellshock 破壳漏洞 Writeup

    破壳漏洞 CVE编号:CVE-2014-6271 题目URL:http://www.whalwl.site:8029/ 提示:flag在服务器根目录 ShellShock (CVE-2014-6271 ...

  8. 关于下载远程文件为未知文件.txt的解决方法

    本地下载文件后缀正常,服务器下载文件后缀都为.txt的解决方法: 后缀为 未知文件.txt 的原因为前端无权限获取Content-Disposition中的文件名 response.setHeader ...

  9. redis中使用SCAN代替KEYS

    前言 由于redis的keys命令是线上禁用,所以就有了SCAN.SSCAN.HSCAN和ZSCAN四个命令. 但是这四个命令也不是每次返回全部匹配结果,因此需要一遍遍执行下去,而且每次返回的curs ...

  10. TypeScript 入门指南 【大白话】

    前言 聊聊为何要学习TypeScript? 从开发角度来讲, TypeScript 作为强类型语言,对属性有类型约束.在日常开发中少了减少了不必要的因参数类型造成的BUG,当你在使用同事封装好的函数时 ...