输入与输出验证--fastapi教程系列

概述

本文主要讲解如何使用mypy(typing)和pydantic标注类,实现输入和输出参数序列化(用drf的话叫序列化)。
主要功能就是验证输入参数和输出参数并转换为标准格式
以BaseModel实例为例,实际上数据在basemodel和body等参数使用规则是一致的。
(有价值的参考:https://blog.csdn.net/swinfans/article/details/89629641)

数据类型

数据类型的核心就在于,一切都基于类,而我们要做的就是把输入输出的数据用类标注出来。

基础数据类型

基础类型主要是分为如下几种:int、float、string、bytes,其他的数据类型都是以基础数据类型进行扩展而得到的。

from pydantic import BaseModel
class Test(BaseModel):
	int_a:int=None
	float_b:float=1.1
	str_c:string
	bytes_d:bytes # 一般这个是用来返回文件的,主要是获取二进制数据

注意:如果为非必须数据,可以使用=None或等于规定类型数据的方式来提供初始值,当然fastapi也可以设置:如果输入的参数为默认值则不将该结果录入到输入

扩展数据类型

扩展数据类型主要是指对基础数据类型更多的要求,比如:url类型(string扩展,对数据结构有要求),image类型(对bytes的扩展),datetime类型(属于类类型,实际也是string的扩展)、date类型等等。(甚至你可以自己定义类型)
这里举个简单的例子:

from pydantic import HttpUrl, BaseModel
from datetime import datetime # 这里还包括date、datetleta

class Test(BaseModel):
    url:HttpUrl
    t:datetime

常用类型:我能看懂的如下:

    # network
    'AnyUrl', 'AnyHttpUrl', 'HttpUrl', 'stricturl', 'EmailStr', 'NameEmail', 'IPvAnyAddress', 'IPvAnyInterface',
    'IPvAnyNetwork', 'PostgresDsn', 'UUID1', 'UUID3', 'UUID4', 'UUID5', 'FilePath', 'DirectoryPath', 'Json',
    # 非pydantic包里面的类型
    # from datetime
    'datetime', 'date',
    # from typing
    'List', 'Dict', 'Set', 'Enum', 'Union'

更多的基础数据类型请自行参考pydantic的文档。也可以自己写验证数据的方法然后

复合数据类型:list、dict、set、enum、union

复合数据类型主要是列表list,字典dict,集合set等。定义方式与基础数据类型最大的区别就是,这些类型主要是存储多个基础数据类型的。
要定义这些数据,需要有一点c语言的思维,单纯用list进行标注,有时候并不能得到更好的数据验证。
比如我只想list存储数字,那么就不能存储字符串,这种情况可以这么写list_e:List[int],如果单纯想存数字和bytes,可以这么写:list_f:List[int,bytes]。方括号里面是可选的类型。如果想让该值也可以为空,则需要使用Optional进行包装:Optional[List[int,bytes]]
这里我举一些常见结构:

from typing import Optional, Dict, Union,List
class TestTuping(BaseModel):
	dict_a: Dict[str,Union[str,int]] = {"chise": "asd","abc":4}#字典的键必须是str,值必须为int或str。注意dict_a不能为None
	list_b:Optional[List[int]]#dict_b可以为None,或者元素全部是int的list类型,Set,tuple参考这一条,
	dict_c:dict_c:Dict[str,HttpUrl]#当然也可以使用上述的扩展数据类型。(自定义的也可以使用)

自定义数据类型与验证

由于pydantic可以做嵌套,所以我们可以自己定义数据验证,下面是一个简单的自定义数据验证例子:

from pydantic import  ValidationError
class Url(BaseModel):
    url: str
    @validator('url')
    def url_must_contain_space(cls, v):
        if ' ' not in v:
            raise ValidationError('must contain a space')#如果错误就触发这个错误
        return v#如果正确就返回结果
#使用方式如下:
class NANME(BaseModel):
	url:Url

一些额外的自动处理方式

可以在BaseModel的继承类里面使用class config进行一些配置:

class Test(BaseModel):
	i:int 
	class config:
		min_anystr_length=True
		...

config的常用部分配置如下:
Config 类包含如下一些类属性:

anystr_strip_whitespace:是否消除字符串或者字节的前导和后置空白空格。默认为 False。
min_anystr_length:字符串或字节的最小长度。默认为0。
max_anystr_length:字符串或字节的最大长度。默认为 2 ** 16
validate_all:是否验证字段的默认值。默认为 False。
extra:是否忽略、允许或禁止模型中的额外属性。可以使用字符串值 ignor,allow或 forbid,也可以使用 Extra 的枚举值。默认值是 Extra.ignore。
use_enum_values:是否使用枚举的 value 特性填充模型,而不是使用原始枚举。这在您希望序列化 model.dict() 时非常有用。默认值为 False。
validate_assignment:是否在为属性赋值时执行验证。默认为 False
以下为 FastAPI 的全套教程: 1. FastAPI 简介 FastAPI 是一个现代化的 Python Web 框架,它使用了 Python 3.6+ 的新特性,如类型注释、异步和协程等。它提供了高性能、易于使用和易于扩展的 API 开发体验。 FastAPI 的主要特点: - 快速:FastAPI 有着非常快的性能,可以达到甚至超过其他 Python Web 框架的速度。 - 易于使用:FastAPIAPI 代码可读性非常高,开发者可以快速理解和使用。 - 自动文档:FastAPI 自动生成 API 文档,并支持交互式 API 文档界面。 - 异步支持:FastAPI 内置支持异步和协程,可以实现非阻塞 IO 和高并发。 - 安全性:FastAPI 内置了安全性功能,包括数据验证、身份验证和授权等。 2. 安装 FastAPI 安装 FastAPI 的最简单方法是使用 pip 包管理器: ```bash pip install fastapi ``` 安装完成后,您可以使用以下命令来检查 FastAPI 的版本: ```bash pip show fastapi ``` 3. 第一个 FastAPI 应用程序 创建一个名为 "main.py" 的文件,在其中编写以下代码: ```python from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} ``` 运行该应用程序: ```bash uvicorn main:app --reload ``` 打开浏览器,输入 http://localhost:8000,您将看到以下输出: ```json {"Hello": "World"} ``` 4. 定义请求参数 FastAPI 支持多种类型的请求参数,包括路径参数、查询参数、请求体等。以下是一个示例: ```python from fastapi import FastAPI app = FastAPI() @app.get("/items/{item_id}") def read_item(item_id: int, q: str = None): return {"item_id": item_id, "q": q} ``` 使用以下 URL 来测试该应用程序: ``` http://localhost:8000/items/42?q=test ``` 您将看到以下输出: ```json {"item_id": 42, "q": "test"} ``` 5. 定义响应模型 FastAPI 可以自动将响应数据转换为指定的模型类。以下是一个示例: ```python from fastapi import FastAPI from pydantic import BaseModel class Item(BaseModel): name: str price: float is_offer: bool = None app = FastAPI() @app.post("/items/") async def create_item(item: Item): return item ``` 使用以下命令来测试该应用程序: ```bash curl -X POST "http://localhost:8000/items/" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -d '{"name":"test item","price":9.99}' ``` 您将看到以下输出: ```json {"name": "test item", "price": 9.99, "is_offer": null} ``` 6. 自动文档 FastAPI 可以自动生成 API 文档,并支持交互式 API 文档界面。只需在浏览器中打开以下 URL 即可: ``` http://localhost:8000/docs ``` 您将看到自动生成的文档和交互式界面。 7. 部署 FastAPI 应用程序 FastAPI 应用程序可以通过多种方式部署,包括使用服务器软件(如 Nginx、Apache)、使用容器技术(如 Docker)等。 以下是使用 Docker 部署 FastAPI 应用程序的示例: 创建一个名为 "Dockerfile" 的文件,包含以下内容: ```dockerfile FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8 COPY ./app /app ``` 在同一目录下创建一个名为 "app" 的目录,将 "main.py" 文件放在其中。 构建 Docker 镜像: ```bash docker build -t fastapi-app . ``` 运行 Docker 容器: ```bash docker run -d --name fastapi-container -p 8000:80 fastapi-app ``` 现在,您可以使用以下 URL 来访问 FastAPI 应用程序: ``` http://localhost:8000 ``` 以上就是 FastAPI 的全套教程,希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值