上节中我们定义了一个简单的请求的module,并未解释为何要这样定义。本节我们讨论一下如何定义一个有效的module, 何为有效呢?需要满足以下三点:
基于我们有效module的解释 我们接下来给出大家一些case进行有效的说明:
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="性别") # 必填字段
我们上面给出的case中,我简单解释一下,我们一般定义一个变量 name, name 是 str 类型,其值为:"haiashiniu"
name: str = "haiashiniu"
那 GetRequest 你可以理解为一种新定义的类型,其值是一个属性字典,有写过C/C++ 的 对于 struct 结构应该不陌生,其结构相似。
get_request = {
"name": "haishiniu",
"age": 19,
"sex": "M"
}
req: GetRequest = GetRequest(**get_request)
比如我们想构造一个如下的数据结构,应该如何去构思写我们的module呢?
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化最后一期介绍一下我自己对这个问题的思考过程。 我先给出我自己的版本供大家参考
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="书籍信息")
在 module 化(上)中我们是对传入参数进行了 module 化,本期我们对传入的参数和输出的参数都做 module 化 处理。
# -*- 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)
我们对本节的内容做简单总结:
本文分享自 python编程从入门到实践 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!