前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python实战 fastapi利器之module(下)

python实战 fastapi利器之module(下)

作者头像
python编程从入门到实践
发布于 2021-02-04 03:26:34
发布于 2021-02-04 03:26:34
57500
代码可运行
举报
运行总次数:0
代码可运行
  • python生产实战 fastapi利器之module(下)
    • 如何应对空数据结构问题?
    • 如何处理方法多输出的问题?
    • 上节思考题解答
    • 总结
python生产实战 fastapi利器之module(下)
如何应对空数据结构问题?

为什么会提出这个问题呢?笔者在开发过程中发现遇到这种情况的case还是很多,我说一个场景看看大家有没有遇到过: 数据我们还是用上节的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
	"persion_info_list": [],
	"count": 128,
	"book": {
		"1": {
			"book_name": "zg",
			"book_price": 66
		},
		"2": {
			"book_name": "zhongwu",
			"book_price": 88
		}

	}
}

场景: 接口传入参数后,通过我们后端的一系列的逻辑判断后最终输出的数据如上述结构,细心的同学应该能发现 persion_info_list 节点下是一个空列表。 我们试想一下是否会出现这种情况呢?太常见了,我解释一下当我们后端经过查询逻辑判断后发现没有满足 persion_info_list 需要添加的节点数据 那自然就会返回一个空的列表,当然还有一些情况是本来是可以返回正常的数据结构的 但是由于种种原因就是没有返回 这时就会返回空列表,相对请求接口的调用方来讲是比较友好的处理方式。

问题: 类似 persion_info_list 这种节点下可能有数据也可能没有数据的这中情况是如何处理呢? 在 fastapi 中处理这个问题是使用 Optional 关键词处理,具体的处理实例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field


class Book(BaseModel):
    book_name: str = Field(...,description="书名")
    book_price: str = Field(...,description="价格")


class Person(BaseModule):
    name: str = Field("haishiniu",description="用户名")
    age: int = Field(18,description="年龄")
    sex: str = Field(...,description="性别")


class ResponseData(BaseModule):
    persion_info_list: Optional[List[Person]] = Field([],description="用户信息")
    count: int = Field(...,description="数量")
    book: Dict[str,Book] = Field({},description="书籍信息")
如何处理方法多输出的问题?

一般情况下,我们是输入的参数是一个或多个输出的参数是一个,但有时候确实需要输出多个参数,那这种的情况下 fastapi 是如何处理的呢?我们通过代码来看一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from typing import Any, Coroutine, Dict, List, Optional, Tuple


@app.get("/info")
async def info(req: GetRequest) -> Tuple[ResponseData,str]:
    # 逻辑处理 这里我直接是用的现成的数据,具体逻辑填充可以依据具体逻辑进行替换
    response_data = {
    "persion_info_list":[
        {
            "name": "zhihui",
            "age": 12,
            "sex": "F"
        }
    ],
    "count": 128,
    "book":{
        "1":{
            "book_name":"zg",
            "book_price": 66
        }
    }
    }

    return ResponseData(**response_data), "hello,word"

通过代码我们可以看到: 输出多个数据是通过 Tuple 结构来控制的 返回的是一个元组类型。

上节思考题解答

我们再来回顾一下上节提到的一个思考题目,如何去拆解这个数据结构做module化呢?我们先再次请出上节给出的数据结构,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
response_data = {
    "persion_info_list":[
        {
            "name": "haishiniu",
            "age": 13,
            "sex": "M"
        },
        {
            "name": "zhihui",
            "age": 12,
            "sex": "F"
        }
    ],
    "count": 128,
    "book":{
        "1":{
            "book_name":"zg",
            "book_price": 66
        },
        "2": {
            "book_name":"zhongwu",
            "book_price": 88
        }

    }
}

我们看一下我图中圈出来的结构,是否能发现或者有些什么思考,其实这些复杂的数据结构都是我们最常见的基础数据结构组合而成的,我们开始学习一门新的语言的时候也是从字符串、列表、字典、元组等开始的,你看其实很多复杂的东西就是由这些简单的“积木”搭建而成的。

我总结一下合理组织module的有效步骤: 1.整理出要输出的最复杂情况下的数据结构 2.基于1 进行按照数字、字符串、字典、列表 等进行拆分 3.划清楚包含与被包含的结构关系 4.基于业务、基于接口的变更频率 拆分出合理的父子关系 5.组合起这一组父子关系的结构

通过以上几个步骤我相信你也可以拆分出优秀的数据结构。我再贴一下我上节的 module 组织结构大家再品品

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field


class Book(BaseModel):
    book_name: str = Field(...,description="书名")
    book_price: str = Field(...,description="价格")


class Person(BaseModule):
    name: str = Field("haishiniu",description="用户名")
    age: int = Field(18,description="年龄")
    sex: str = Field(...,description="性别")


class ResponseData(BaseModule):
    persion_info_list: Optional[List[Person]] = Field([],description="用户信息")
    count: int = Field(...,description="数量")
    book: Dict[str,Book] = Field({},description="书籍信息")
总结

我们对今天的内容做简单总结: 1.我们通过两个案例向大家展示了常见的使用中的问题 2.解答了上节一个重要的思考题目

本部分通过三小结的内容为大家阐述了: 1.什么是 module 化 2.为何使用 module 化 3.如何使用 module 化 4.遇到常见问题的处理方法

到此为止,我们已经分享完了关于 module 常用的知识点,满足日常开发工作是完全可以的,若还想深入的了解关于 module 的相关知识可以私信我。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python编程从入门到实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python实战 fastapi利器之module(中)
上节中我们定义了一个简单的请求的module,并未解释为何要这样定义。本节我们讨论一下如何定义一个有效的module, 何为有效呢?需要满足以下三点:
python编程从入门到实践
2021/02/04
6800
python实战 fastapi利器之module(上)
from typing import Any, Dict, List, Optional from pydantic import BaseModel, Field
python编程从入门到实践
2021/01/18
9330
FastAPI 学习之路(十)
还是之前的例子,我们现在书有这样的一个属性,在哪里出售。我们需要增加这样的一个字段,而且书的可以销售的地方是多个的,那么我们应该如何实现呢。
雷子
2021/08/25
5020
fastapi 请求体 - 多个参数 / 字段Field / 嵌套模型
learn from https://fastapi.tiangolo.com/zh/tutorial/body-multiple-params/
Michael阿明
2022/01/07
1.8K0
fastapi 请求体 - 多个参数 / 字段Field / 嵌套模型
FastAPI官方教程太棒了(上)
在2020年的Python开发者调查结果中,有这样一段话:“FastAPI在此次调查迭代中首次被引为选项,表现为Python第三流行的Web框架。”
dongfanger
2022/06/30
4.2K0
FastAPI官方教程太棒了(上)
FastAPI(15)- 声明请求示例数据
可以使用 Config cass 和 schema_extra 为 Pydantic Model 声明一个示例值
小菠萝测试笔记
2021/09/27
8810
fastapi 请求文件 / 表单 / 处理错误 / 路径操作配置 / jsonable_encoder
learn from https://fastapi.tiangolo.com/zh/tutorial/request-files/
Michael阿明
2022/01/07
1.1K0
fastapi 请求文件 / 表单 / 处理错误 / 路径操作配置 / jsonable_encoder
FastAPI学习-8.POST请求body中添加Field
前言 与使用 Query、Path 和 Body 在路径操作函数中声明额外的校验和元数据的方式相同,你可以使用 Pydantic 的 Field 在 Pydantic 模型内部声明校验和元数据。 Field 字段参数说明 关于 Field 字段参数说明 Field(None) 是可选字段,不传的时候值默认为None Field(…) 是设置必填项字段 title 自定义标题,如果没有默认就是字段属性的值 description 定义字段描述内容 from pydantic import BaseModel,
上海-悠悠
2022/03/08
1K0
FastAPI(19)- Response Model 响应模型
Optional[Union[SetIntStr, DictIntStrAny]]
小菠萝测试笔记
2021/09/27
1.3K0
fastapi 响应模型 / 响应状态码 / 表单参数
learn from https://fastapi.tiangolo.com/zh/tutorial/response-model/
Michael阿明
2022/01/07
8970
fastapi 响应模型 / 响应状态码 / 表单参数
fastapi 模式的额外信息,示例 / Cookie参数 / Header参数
learn from https://fastapi.tiangolo.com/zh/tutorial/schema-extra-example/
Michael阿明
2022/01/07
4510
fastapi 模式的额外信息,示例 / Cookie参数 / Header参数
FastAPI(14)- 路径操作函数参数的类型是一个嵌套 Pydantic Model 的使用场景
tags 虽然声明为 Set(),但在接口层面并没有集合这个概念,所以还是传数组 [ ] 格式哦,并不是传 { } 哦
小菠萝测试笔记
2021/09/27
7410
python编程 30秒高级私人定制 Response对象
/ python 编程 30 秒高级私人定制 Response 对象,十倍扩展效率 /
python编程从入门到实践
2021/03/16
9030
python编程 30秒高级私人定制 Response对象
fastapi PUT更新数据 / PATCH部分更新
learn from https://fastapi.tiangolo.com/zh/tutorial/body-updates/
Michael阿明
2022/01/07
1.4K0
fastapi PUT更新数据 / PATCH部分更新
FastAPI学习-6.POST请求 JSON 格式 body
前言 post请求接收json格式请求body 创建数据模型 从 pydantic 中导入 BaseModel, 将你的数据模型声明为继承自 BaseModel 的类。 from typing import Optional from fastapi import FastAPI from pydantic import BaseModel class Item(BaseModel): name: str description: Optional[str] = None pri
上海-悠悠
2022/03/08
10.7K0
FastAPI 学习之路(十一)
我们有这样的一个需求,我们希望可以看到接口的一个简单的请求示例展示在我们的接口文档中,应该如何实现呢。我们看下如何实现的:
雷子
2021/08/25
5710
FastAPI(8)- 请求体 Request Body
选了 text 之后,因为不是 JSON 字符串,FastAPI 无法正确解析请求体为 dict,所以会报类型错误的提示
小菠萝测试笔记
2021/09/27
4.1K0
FastAPI学习-9. Swagger文档输出请求示例example
前言 可以在 Swagger文档上看到请求示例example,使用Pydantic schema_extra属性来实现。 schema_extra 使用 Config 和 schema_extra 为Pydantic模型声明一个示例,如Pydantic 文档:定制 Schema 中所述: from typing import Optional from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class
上海-悠悠
2022/03/08
4.4K0
FastAPI 学习之路(二十一)请求体 - 更新数据
我们都知道,去创建请求体,更新数据我们用PUT请求,我们去试着更新下数据。
雷子
2021/08/25
9080
FastAPI-RESTful API设计(一)
让我们通过一个简单的示例来演示如何使用 FastAPI 创建 RESTful API。我们将创建一个简单的电子商务 API,用于管理产品和订单。
堕落飞鸟
2023/05/07
5300
推荐阅读
相关推荐
python实战 fastapi利器之module(中)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文