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

python实战 fastapi利器之module(中)

作者头像
python编程从入门到实践
发布2021-02-04 11:26:14
6240
发布2021-02-04 11:26:14
举报
  • python生产实战 fastapi利器之module(中)
    • 如何定义有效的 module ?
    • 定义 module 需要注意什么 ?
    • 复杂生产环境 module 定义举例
    • fastapi 中 使用 module 化数据进行交互
    • 总结
python生产实战 fastapi利器之module(中)
如何定义有效的 module ?

上节中我们定义了一个简单的请求的module,并未解释为何要这样定义。本节我们讨论一下如何定义一个有效的module, 何为有效呢?需要满足以下三点:

  1. 字段定义要见名知义,不用无意义的字段。
  2. 字段类型要明确,是str 就不要定义为 int
  3. 是否允许有默认值,需要明确指出 每次定义一个module的时候都可以思考一下,自己的module是否是有效的。
定义 module 需要注意什么 ?

基于我们有效module的解释 我们接下来给出大家一些case进行有效的说明:

代码语言:javascript
复制
from typing import Any, Dict
from pydantic import BaseModel, Field

# bad case
class GetRequest(BaseModel):
    a: str = Field(...,)
    b: int = Field(...,)
    c: str = Field(...,)

# good case
class GetRequest(BaseModel):
    name: str = Field("haishiniu",description="用户名")  # 有默认值需要指出
    age: int = Field(18,description="年龄")  # 有默认值需要指出
    sex: str = Field(...,description="性别")  # 必填字段
复杂生产环境 module 定义举例

我们上面给出的case中,我简单解释一下,我们一般定义一个变量 name, name 是 str 类型,其值为:"haiashiniu"

代码语言:javascript
复制
name: str = "haiashiniu"

那 GetRequest 你可以理解为一种新定义的类型,其值是一个属性字典,有写过C/C++ 的 对于 struct 结构应该不陌生,其结构相似。

代码语言:javascript
复制
get_request = {
    "name": "haishiniu",
    "age": 19,
    "sex": "M"
}
req: GetRequest = GetRequest(**get_request)

比如我们想构造一个如下的数据结构,应该如何去构思写我们的module呢?

代码语言:javascript
复制
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化呢?这个问题留给大家进行思考,下期关于module化最后一期介绍一下我自己对这个问题的思考过程。 我先给出我自己的版本供大家参考

代码语言:javascript
复制
from typing import Any, Dict, List
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: List[Person] = Field([],description="用户信息")
    count: int = Field(...,description="数量")
    book: Dict[str,Book] = Field({},description="书籍信息")
fastapi 中 使用 module 化数据进行交互

在 module 化(上)中我们是对传入参数进行了 module 化,本期我们对传入的参数和输出的参数都做 module 化 处理。

代码语言:javascript
复制
# -*- encoding: utf-8 -*-
from fastapi import FastAPI,Depends,Request
from typing import Any, Dict
from pydantic import BaseModel, Field

app = FastAPI()


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


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: List[Person] = Field([],description="用户信息")
    count: int = Field(...,description="数量")
    book: Dict[str,Book] = Field({},description="书籍信息")


@app.get("/info")
async def info(req: GetRequest) -> ResponseData:
    # 逻辑处理 这里我直接是用的现成的数据,具体逻辑填充可以依据具体逻辑进行替换
    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
                    }

                }
    }

    return ResponseData(**response_data)



async def get_common_query_params(request: Request) -> GetRequest:
    common_dict: Dict[str, Any] = dict(
        name=request.query_params.get("name") or "",
        age=request.query_params.get("age") or 0,
        sex=request.query_params.get("sex") or "",
    )

    params = GetRequest(**common_dict,)
    return params



@app.get("/infos/v1")
async def info_v1(req: GetRequest = Depends(get_common_query_params)) -> ResponseData:

    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
                    }

                }
    }

    return ResponseData(**response_data)
总结

我们对本节的内容做简单总结:

  1. 知道如何定义一个有效的 module
  2. 定义复杂的结构,给出了具有代表性的生产结构及处理方式
  3. 演示了生产环境如何去使用 module 去定义入参和出参
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • python生产实战 fastapi利器之module(中)
    • 如何定义有效的 module ?
      • 定义 module 需要注意什么 ?
        • 复杂生产环境 module 定义举例
          • fastapi 中 使用 module 化数据进行交互
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档