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 uvicornfrom fastapi import FastAPIapp = 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 APIRoutershop = APIRouter()@shop.get("/food")
def shop_food():return {"shop": "food"}@shop.get("/bed")
def shop_food():return {"shop": "bed"}

在这里插入图片描述

from fastapi import APIRouteruser = 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 uvicornfrom 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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java-集合框架】ArrayList类

📢java基础语法,集合框架是什么?顺序表的底层模拟实现都是看本篇前的基础必会内容,本篇不再赘述,详情见评论区文章。 📢编程环境:idea 【java-集合框架】ArrayList类 1. 先回忆一下java代码中常…

泽攸科技JS系列高精度台阶仪在半导体领域的应用

泽攸科技JS系列高精度台阶仪是一款先进的自主研发的国产台阶仪,采用了先进的扫描探针技术。通过扫描探针在样品表面上进行微观测量,台阶仪能够准确获取表面形貌信息。其工作原理基于探针与样品表面的相互作用力,通过测量探针的微小位移&#…

JVM相关面试题

【面试题一】谈谈JVM内存模型 JVM内存区域的划分,之所以划分是为了JVM更好的进行内存管理。就好比一间卧室,这块放床,这块放个电脑桌,每块地方各自有各自的功能,床用来睡觉,电脑桌用来办公打游戏。而JVM划…

docker常用命令和环境部署详解

Docker是一个开源的容器化平台,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。以下是Docker的一些常用命令和环境部署的详解: Docker常用命令: 查看…

C++——基础语法(3):内联函数、auto关键字、基于范围的for循环、空指针nullptr

6. 内联函数 在函数前加入inline修饰即可将函数变为内联函数。所谓内联函数,就是在编译时C编译器会将函数体在调用内联函数的地方展开,从而省去了调用函数的栈帧开销,提高程序运行效率。 inline int Add(int a, int b) {return a b; } int …

什么是企业级服务器?

服务器在应用层次方面分为入门级服务器、工作组级服务器、部门级服务器和企业级服务器。那么什么是企业级服务器,具体包含哪些内容呢,今天小编就带领大家大概的了解一下吧! 企业级服务器是高级服务器之一,服务器性能比入门级服务器…

SpringBoot源码解读与原理分析(三十三)SpringBoot整合JDBC(二)声明式事务的生效原理和控制流程

文章目录 前言10.3 声明式事务的生效原理10.3.1 TransactionAutoConfiguration10.3.2 TransactionManagementConfigurationSelector10.3.3 AutoProxyRegistrar10.3.4 InfrastructureAdvisorAutoProxyCreator10.3.5 ProxyTransactionManagementConfiguration10.3.5.1 Transactio…

Datawhale-Sora技术原理分享

目录 Sora能力边界探索 Sora模型训练流程 Sora关键技术拆解 物理引擎的数据进行训练 个人思考与总结 参考 https://datawhaler.feishu.cn/file/KntHbV3QGoEPruxEql2c9lrsnOb

道可云元宇宙每日资讯|沙特推出世界首个国家级“元宇宙”平台

道可云元宇宙每日简报(2024年2月27日)讯,今日元宇宙新鲜事有: 沙特推出世界首个国家级“元宇宙”平台 据 Gulf News 等媒体报道,沙特阿拉伯文化部近日宣布上线全球首个国家级“元宇宙”平台,该平台由先进…

题目 1282: 公交汽车

题目描述: 一个特别的单行街道在每公里处有一个汽车站。顾客根据他们乘坐汽车的公里使来付费。例如下表就是一个费用的单子。 没有一辆车子行驶超过10公里&#xff0c;一个顾客打算行驶n公里&#xff08;1< n< 100&#xff09;&#xff0c;它可以通过无限次的换车来完…

袁庭新ES系列12节 | Elasticsearch高级查询操作

前言 上篇文章讲了关于Elasticsearch的基本查询操作。接下来袁老师为大家带来Elasticsearch高级查询部分相关的内容。Elasticsearch是基于JSON提供完整的查询DSL&#xff08;Domain Specific Language&#xff1a;领域特定语言&#xff09;来定义查询。因此&#xff0c;我们有…

消息中间件篇之Kafka-消息不丢失

一、 正常工作流程 生产者发送消息到kafka集群&#xff0c;然后由集群发送到消费者。 但是可能中途会出现消息的丢失。下面是解决方案。 二、 生产者发送消息到Brocker丢失 1. 设置异步发送 //同步发送RecordMetadata recordMetadata kafkaProducer.send(record).get();//异…

【Java程序设计】【C00296】基于Springboot的4S车辆管理系统(有论文)

基于Springboot的4S车辆管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的4S店车辆管理系统 本系统分为销售员功能模块、管理员功能模块以及维修员功能模块。 管理员功能模块&#xff1a;管理员登录进入4S…

Langchain 加载网络信息实现RAG以及UnstructuredURLLoader的使用

以下实现了从 wikipedia 加载 Android 的网页然后保存在本地的向量数据库&#xff0c;然后通过上下文发给大模型&#xff0c;让他来总结什么是android 。 from langchain_community.vectorstores import Chroma from langchain_core.prompts import ChatPromptTemplate from l…

少儿编程热潮背后的冷思考、是不是“智商税”?

在科技飞速发展的今天&#xff0c;编程已成为一项基础技能&#xff0c;如同数学和语言一样&#xff0c;被认为是未来社会的重要通行证。随之而来的是少儿编程教育的火爆&#xff0c;各种编程班、在线课程如雨后春笋般涌现&#xff0c;吸引了无数家长的目光。然而&#xff0c;这…

【JS】【Vue3】【React】获取滚轮位置的方法:JavaScript、Vue 3和React示例

目录 使用JavaScript原生方法在Vue 3中获取滚轮位置在React中获取滚轮位置 随着Web应用程序的发展&#xff0c;滚轮位置的获取变得越来越重要&#xff0c;可以用于实现页面的滚动效果、导航条的隐藏和显示等功能。本文将探讨在JavaScript、Vue 3和React中获取滚轮位置的不同方法…

C语言——switch 语句的基本格式是什么?

一、问题 C语⾔中有两个构成选择结构的语句&#xff0c;即构成双分⽀的让if..else 语句和构成多分⽀的 switch..case 语句&#xff0c;switch 语句的基本格式是什么&#xff1f; 二、解答 switch (表达式) { case 常量表达式 1:语句1;break;case 常量表达式 n:语句n;break;de…

嵌入式学习day26 Linux

1.exec函数族 extern char **environ; int execl(const char *path, const char *arg, ... /* (char *) NULL */); int execlp(const char *file, const char *arg, ... /* (char *) NULL */); int execle(const char *…

【深度好文】simhash文本去重流程

对于类似于头条客户端而言,推荐的每一刷的新闻都必须是不同的新闻,这就需要对新闻文本进行排重。传统的去重一般是对文章的url链接进行排重,但是对于抓取的网页来说,各大平台的新闻可能存在重复,对于只通过文章url进行排重是不靠谱的,为了解决这个痛点于是就提出了用simh…

测试环境搭建整套大数据系统(七:集群搭建kafka(2.13)+flink(1.14)+dinky+hudi)

一&#xff1a;搭建kafka。 1. 三台机器执行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下俩内容 1.三台机器分别给予各自的broker_id…