【Python系列】FastAPI 中的路径参数和非路径参数解析问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

在 FastAPI 框架中,路由的配置是构建 RESTful API 的关键步骤。路由配置不仅需要正确地定义路径参数,还需要正确地处理非路径参数,以确保 API 的访问逻辑清晰且正确。然而,当路径参数和非路径参数的前缀一致时,可能会出现一些混淆,导致非预期的路由行为。本文将通过分析给出的代码示例,探讨这一问题,并提供相应的解决方案。

1.问题描述

在提供的代码示例中,我们可以看到两个路由装饰器@KBRouter.post被应用于两个不同的函数。第一个函数get接收一个路径参数id,而第二个函数get则没有路径参数,但接收一个非路径参数info。两个函数的路由路径前缀都是/collection/docs,这可能导致一些混淆。

FastAPI 路径参数和非路径参数的前缀一致,当访问非路径参数的接口时,会走到路径参数的接口中

python 复制代码
@staticmethod
@KBRouter.post("/collection/docs/{id}", description="路径参数接口",
               summary="路径参数接口")
async def get(id: str = None):
    return {
        "code": 0,
        "data": None,
        "msg": "成功"
    }
python 复制代码
@staticmethod
@KBRouter.post("/collection/docs/add", description="非路径参数接口",
               summary="非路径参数接口")
async def get(info: str = None):
    return {
        "code": 0,
        "data": None,
        "msg": "成功",
    }

2.问题分析

FastAPI 使用基于 Python 类型提示的参数来定义路径参数和查询参数。路径参数通过在函数参数中使用Path来声明,而非路径参数则直接作为函数参数声明。在上述代码中,第一个get函数使用Path来声明路径参数id,而第二个get函数则直接声明了非路径参数info

问题出现在两个函数的路由路径前缀相同,但一个是路径参数,另一个是非路径参数。当客户端发送请求到/collection/docs/add时,FastAPI 可能会错误地将请求路由到第一个get函数,因为add可以被解释为id的值。

3.解决方案

为了解决这个问题,我们需要确保路径参数和非路径参数的路由清晰区分。以下是几种可能的解决方案:

  1. 更改非路径参数的路由前缀 :最简单的方法是更改第二个get函数的路由前缀,以避免与路径参数的前缀冲突。例如,可以将/collection/docs/add更改为/collection/docs/non_path

  2. 使用不同的 HTTP 方法:如果逻辑允许,可以考虑为两个接口使用不同的 HTTP 方法,比如 GET 和 POST,这样可以在不改变路由前缀的情况下区分它们。

  3. 明确区分路径参数和非路径参数:在设计 API 时,应该明确区分路径参数和非路径参数的使用场景,避免在同一个前缀下同时使用它们。

  4. 使用请求体来传递非路径参数:如果非路径参数的数据量较大或者需要更复杂的数据结构,可以考虑使用请求体(如 JSON)来传递这些参数,而不是通过查询参数。

  5. 增加 API 文档和版本控制:通过增加详细的 API 文档和版本控制,可以帮助开发者和用户更好地理解 API 的使用方法,减少因路由混淆导致的错误。

4.最佳实践

在设计和实现 FastAPI 应用时,应该遵循以下最佳实践:

  • 清晰的路由设计:确保每个路由都有清晰、明确的含义,避免使用容易引起混淆的参数名或前缀。

  • 合理的参数使用:合理使用路径参数和非路径参数,确保它们的使用场景和目的清晰。

  • 充分的测试:在部署 API 之前,进行充分的测试,包括单元测试和集成测试,确保 API 的行为符合预期。

  • 错误处理:实现错误处理逻辑,当请求不符合预期时,能够返回清晰的错误信息。

  • 遵循 RESTful 原则 :设计 API 时,遵循 RESTful 原则,使用合适的 HTTP 方法和状态码来表达操作和结果。

5.结论

FastAPI 是一个强大而灵活的框架,但在设计 API 时,需要特别注意路径参数和非路径参数的区分,以避免路由混淆的问题。通过上述的解决方案和最佳实践,可以确保 API 的清晰性和可用性,为用户提供更好的服务。

觉得有用的话点个赞 👍🏻 呗。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关推荐
zwjapple11 分钟前
typescript里面正则的使用
开发语言·javascript·正则表达式
小五Five12 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
前端每日三省14 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
好看资源平台23 分钟前
网络爬虫——综合实战项目:多平台房源信息采集与分析系统
爬虫·python
凡人的AI工具箱27 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
chnming198743 分钟前
STL关联式容器之map
开发语言·c++
进击的六角龙44 分钟前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂1 小时前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
湫ccc1 小时前
Python简介以及解释器安装(保姆级教学)
开发语言·python
孤独且没人爱的纸鹤1 小时前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai