FastAPI入门到精通笔记(三)

image-20220826232100824

总代码

先上总代码,导入相关依赖包即可正常编译运行

from fastapi import FastAPI, Path, Query, Cookie, Header
from enum import Enum  #导入枚举类型
from typing import Optional, List
from pydantic import BaseModel, Field
from datetime import date
import uvicorn

test = FastAPI()


@test.get("/path/canshu")
def path_01():
    '''路径参数和数字验证'''
    return {
    
    "message":"This is a message"}

@test.get("/path/{canshu}")
def path_01(canshu):
    return {
    
    "message": canshu}

class CityName(str, Enum):
    Beijing = 'Slaine'
    Shanghai = 'Troyard'

@test.get("/enum/{city}")
async def latest(city: CityName):
    if city == CityName.Beijing:
        return {
    
    "city_name":city, "confirmed": 1492, "death": 9}
    if city == CityName.Shanghai:
        return {
    
    "city_name": city, "confirmed": 1550, "death": 29}
    return {
    
    "city_name":city, "latest": "unknown"}

@test.get("/file/{file_path:path}")
def filepath(file_path: str):
    '''默认都可传递\路径,有无:path直接区别能否传递/的路径'''
    return f"The file path is {
      
      file_path}"

    '''长度和正则表达式的验证,最频繁且实用的接口规则'''
@test.get("/path_wm/{num}")
def path_jy(      #下面...同None
     num : int = Path(..., title="Exanple", description="无描述", ge=1,le=10)
):

  return num


@test.get("/query")
def page_limit(page: int=1, limit: Optional[int] = None):#这里的page和limit查询两参数都已有默认值
    '''查询参数和字符串验证'''
    if limit: #如果存在limit值传入
        return {
    
    "page":page, "limit":limit}
    return {
    
    "page":page}

@test.get("/query/bool/con")
def type_con(param: bool = False): #
    '''查询参数设定默认值为Flase'''
    return param

@test.get("/query/va")
def query_pa(
    value: str = Query(..., min_length=3, max_length=6, regex="^a"), #请求参数的字符长度和起始限制
    values: List[str] = Query(default=["v1", "v2"], alias="这是起的别名") #队列形式添加字符串和别名
):
    return value, values

'''请求体和字段'''
class CityInfo(BaseModel):
    name: str = Field(..., example = "SlainWWWe")
    country: str
    country_code: str = None
    country_population: int=Field(default=800, title="人口数量", description="国家人口数量" ,ge=500)#最小值为500

    class Config:
        schema_extra = {
    
    
            "example" : {
    
       #这里注意是 example 关键词,才能让以下字段设为默认字段
               "name": "Shanghai",
               "country": "ChinaMMM",
               "country_code": "CN",
               "country_population": 1400000000,
            }
        }

@test.post("/request_body/city")
def city_info(city: CityInfo):
    '''请求体和字段'''
    print(city.name, city.country)
    return city.dict()

'''查询参数、路径参数、请求体 多参数混合使用'''

@test.put("/request_body/city/{name}")
def mix_city(
        name: str, #路径参数
        city01: CityInfo,#请求体body
        city02: CityInfo,#同上
        confirmed: int = Query(ge=0, description="确诊数量", default=0), #查询参数
        death: int = Query(ge=0, description="死亡数量", default=0),#同上
   ):
    if name == "Slaine":
        return {
    
    "Slaine": {
    
    "confirmed": confirmed, "death":death}}
    return city01.dict(), city02.dict()

'''数据格式嵌套的请求体'''
class Data(BaseModel):
      city: List[CityInfo] = None  #定义数据格式嵌套的请求体,且因为是List列表形式所以可用传入多组city
      date: date  #直接使用datatime包中的date
      # 使用pydantic定义请求体数据时候要对字段进行校验,一般用Field类校验
      #使用路径参数时候对数据进行Path类校验,对查询参数进行校验使用Query类
      confirmed: int = Field(ge=0, description="确诊数量", default=0)
      death: int = Field(ge=0, description="死亡数量", default=0)
      recovered: int = Field(ge=0, description="痊愈数目", default=0)

@test.put("/request_body/nested")
def nested_models(data: Data):
    return data

'''Cookie 和 Header参数'''

@test.get("/cookie")
def cookie(cookie_id: Optional[str] = Cookie(None)): #这里的Cookie(None)就是对 cookie类型默认值 的设置,若没有Cookie(),即为设定cookie_id的查询参数
    return {
    
    "cookie_id": cookie_id}

@test.get("/header")                  #这里的Header()同上,convert_underscores=True是自动将下划线 _ 转换为 - (有的情况下下划线会报错)
def header(user_agent: Optional[str] = Header(None, convert_underscores=True), x_token: List[str] = Header(None)):
    return {
    
    "user_agent":user_agent, "x_token": x_token}
#user_agent即使不设置值也会返回当前浏览器参数值

if __name__ =='__main__':
    uvicorn.run(test, host='127.0.0.1', port=8009)

在运行端口的/docs目录下有自带测试接口的界面

路径参数接口

@test.get("/path/canshu")
def path_01():
    '''路径参数和数字验证'''
    return {
    
    "message":"This is a message"}

@test.get("/path/{canshu}")
def path_01(canshu):
    return {
    
    "message": canshu}

url请求和响应

image-20220825234715109

url请求和响应

image-20220825234808374

因为是GET传参,也可以用url请求测试

image-20220825234904590

定义类中待选属性的接口传参

class CityName(str, Enum):
    Beijing = 'Slaine'
    Shanghai = 'Troyard'

@test.get("/enum/{city}")
async def latest(city: CityName):
    if city == CityName.Beijing:
        return {
    
    "city_name":city, "confirmed": 1492, "death": 9}
    if city == CityName.Shanghai:
        return {
    
    "city_name": city, "confirmed": 1550, "death": 29}
    return {
    
    "city_name":city, "latest": "unknown"}

image-20220825235123358

利用:path允许/ \ 的路径传参接口

@test.get("/file/{file_path:path}")
def filepath(file_path: str):
    '''默认都可传递\路径,有无:path直接区别能否传递/的路径'''
    return f"The file path is {
      
      file_path}"
image-20220825235312487

对输入字符限制的传参接口

 '''长度和正则表达式的验证,最频繁且实用的接口规则'''
@test.get("/path_wm/{num}")
def path_jy(      #下面...同None
     num : int = Path(..., title="Exanple", description="无描述", ge=1,le=10)
):

  return num
image-20220825235407422

为page和limit变量传入对应的参数

@test.get("/query")
def page_limit(page: int=1, limit: Optional[int] = None):#这里的page和limit查询两参数都已有默认值
    '''查询参数和字符串验证'''
    if limit: #如果存在limit值传入
        return {
    
    "page":page, "limit":limit}
    return {
    
    "page":page}

image-20220826001225148

传入布尔值参数并返回

@test.get("/query/bool/con")
def type_con(param: bool = False): #
    '''查询参数设定默认值为Flase'''
    return param

image-20220826001332995

对传入字符串长度和开头限制的别名接口;队列形式添加字符串和别名

@test.get("/query/va")
def query_pa(
    value: str = Query(..., min_length=3, max_length=6, regex="^a"), #请求参数的字符长度和起始限制
    values: List[str] = Query(default=["v1", "v2"], alias="这是起的别名") #队列形式添加字符串和别名
    ):
    return value, values
image-20220826001818168

POST传入类中属性参数接口

'''请求体和字段'''
class CityInfo(BaseModel):
    name: str = Field(..., example = "SlainWWWe")
    country: str
    country_code: str = None
    country_population: int=Field(default=800, title="人口数量", description="国家人口数量" ,ge=500)#最小值为500

    class Config:
        schema_extra = {
    
    
            "example" : {
    
       #这里注意是 example 关键词,才能让以下字段设为默认字段
               "name": "Shanghai",
               "country": "ChinaMMM",
               "country_code": "CN",
               "country_population": 1400000000,
            }
        }

@test.post("/request_body/city")
def city_info(city: CityInfo):
    '''请求体和字段'''
    print(city.name, city.country)
    return city.dict()
image-20220826225111226

查询参数、路径参数、请求体 多参数混合使用

'''查询参数、路径参数、请求体 多参数混合使用'''

@test.put("/request_body/city/{name}")
def mix_city(
        name: str, #路径参数
        city01: CityInfo,#请求体body
        city02: CityInfo,#同上
        confirmed: int = Query(ge=0, description="确诊数量", default=0), #查询参数
        death: int = Query(ge=0, description="死亡数量", default=0),#同上
   ):
    if name == "Slaine":
        return {
    
    "Slaine": {
    
    "confirmed": confirmed, "death":death}}
    return city01.dict(), city02.dict()
image-20220826225418566

数据格式嵌套的请求体接口

'''数据格式嵌套的请求体'''
class Data(BaseModel):
      city: List[CityInfo] = None  #定义数据格式嵌套的请求体,且因为是List列表形式所以可用传入多组city
      date: date  #直接使用datatime包中的date
      # 使用pydantic定义请求体数据时候要对字段进行校验,一般用Field类校验
      #使用路径参数时候对数据进行Path类校验,对查询参数进行校验使用Query类
      confirmed: int = Field(ge=0, description="确诊数量", default=0)
      death: int = Field(ge=0, description="死亡数量", default=0)
      recovered: int = Field(ge=0, description="痊愈数目", default=0)

@test.put("/request_body/nested")
def nested_models(data: Data):
    return data
image-20220826230850971

Cookie 和 Header参数传入接口

'''Cookie 和 Header参数'''

@test.get("/cookie")
def cookie(cookie_id: Optional[str] = Cookie(None)): #这里的Cookie(None)就是对 cookie类型默认值 的设置,若没有Cookie(),即为设定cookie_id的查询参数
    return {
    
    "cookie_id": cookie_id}

@test.get("/header")                  #这里的Header()同上,convert_underscores=True是自动将下划线 _ 转换为 - (有的情况下下划线会报错)
def header(user_agent: Optional[str] = Header(None, convert_underscores=True), x_token: List[str] = Header(None)):
    return {
    
    "user_agent":user_agent, "x_token": x_token}#user_agent即使不设置值也会返回当前浏览器参数值
image-20220826231857908

猜你喜欢

转载自blog.csdn.net/NZXHJ/article/details/126551837