首页 > 其他分享 >深入FastAPI:掌握使用多个关联模型的高级用法

深入FastAPI:掌握使用多个关联模型的高级用法

时间:2024-09-08 14:52:34浏览次数:10  
标签:FastAPI 关联 用法 dict user str new password

在构建RESTful API时,经常需要处理复杂的数据关系。FastAPI通过支持多个关联模型,使得定义这些关系变得简单直观。这种方法不仅提高了代码的可维护性,还增强了API的灵活性。通过使用Pydantic库,我们可以轻松定义数据模型及其关联,从而在FastAPI应用中实现强大的数据处理逻辑。无论是一对多、多对一还是多对多的关系,FastAPI都能游刃有余。掌握这一技巧,将帮助你构建更加健壮和高效的API。

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, EmailStr
from typing import Optional

# 创建 FastAPI 应用实例
api = FastAPI()

# 定义输入用户模型
class NewUser(BaseModel):
    nickname: str  # 用户名
    secret: str  # 密码
    contact: EmailStr  # 邮箱
    real_name: Optional[str] = None  # 真实姓名,可选

# 定义输出用户模型
class ExistingUser(BaseModel):
    nickname: str  # 用户名
    contact: EmailStr  # 邮箱
    real_name: Optional[str] = None  # 真实姓名,可选

# 定义数据库用户模型
class UserDB(BaseModel):
    nickname: str  # 用户名
    secure_password: str  # 加密密码
    contact: EmailStr  # 邮箱
    real_name: Optional[str] = None  # 真实姓名,可选

# 模拟密码加密函数
def mock_password_encrypter(plain_text: str) -> str:  # 加密明文密码
    """加密明文密码"""
    return "encrypted_" + plain_text

# 模拟保存用户到数据库的函数
def mock_user_storage(new_user: NewUser) -> UserDB:  # 模拟保存用户到数据库
    """模拟将新用户保存到数据库"""
    secure_password = mock_password_encrypter(new_user.secret)
    user_db = UserDB(**new_user.dict(), secure_password=secure_password)
    """ **new_user.dict()双星号函数 """
    print("用户数据已存储!...虚拟的")
    return user_db

# 创建用户端点
@api.post("/add_user/", response_model=ExistingUser)
async def add_new_user(new_user: NewUser) -> ExistingUser:  # 创建新用户并返回用户信息
    """创建新用户并返回用户信息"""
    try:
        saved_user = mock_user_storage(new_user)
        return saved_user
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))  # 服务器内部错误

注解说明:

  1. 字段注解:在 NewUser, ExistingUser, UserDB 类的字段定义中,添加了注释来描述每个字段的含义。

  2. 函数参数和返回值注解:在 mock_password_encryptermock_user_storage 函数定义中,添加了注释来描述函数的作用和返回值类型。

  3. 文档字符串:在每个函数和方法的开始处,添加了文档字符串(docstring),这些字符串详细描述了函数的作用和行为。

  4. 异常处理注解:在 add_new_user 函数中,添加了注释来描述异常处理逻辑。

  5. 双星号字典解包: **new_user.dict()

    • new_user.dict() 会将Pydantic模型的实例转换为一个普通的Python字典
    • 双星号是一个特殊的语法符号,用于表示双星号字典解包操作。当使用在函数调用中时,它允许你将一个字典对象的所有键值对作为关键字参数传递给函数。

这些注解和文档字符串有助于提高代码的可读性和可维护性,同时也使得代码更加易于理解

解包 dict 和更多关键字

例如:

UserInDB(**user_in.dict(), hashed_password=hashed_password)

输出的结果如下:

UserInDB(
    username = user_dict["username"],
    password = user_dict["password"],
    email = user_dict["email"],
    full_name = user_dict["full_name"],
    hashed_password = hashed_password,
)

标签:FastAPI,关联,用法,dict,user,str,new,password
From: https://blog.51cto.com/u_17005223/11952111

相关文章

  • 问:聊一下NIO模型在Netty框架中的用法?
    1.核心概念和特点Netty是一个基于JavaNIO(Non-blockingI/O)的高性能网络应用框架,它简化了网络编程,如TCP和UDP套接字服务器的开发。Netty的核心概念包括:Channel:Netty中的基本I/O操作抽象。Channel表示一个打开的连接,可以进行读写操作。EventLoop:负责处理Channel上的事件......
  • 这些ES6用法你都会吗?
    一关于取值取值在程序中非常常见,比如从对象obj中取值constobj={a:1b:2c:3d:4}吐槽:consta=obj.a;constb=obj.b;constc=obj.c;//或者constf=obj.a+obj.b;constg=obj.c+obj.d;改进:用ES6解构赋值const{a,b,c,d}=obj......
  • service和endpoints是如何关联的?
    在Kubernetes中,Service和Endpoints之间的关联通过标签选择器和动态更新机制实现。以下是它们之间的关系及一个具体的示例。关联机制标签选择器:当创建一个Service时,可以指定一个标签选择器,这个选择器用于匹配后端Pod。符合选择器条件的Pod会被纳入到Endpoints中。......
  • crypto插件的用法
    文章目录1.概念介绍2.方法与功能2.1基本用法2.2加密算法3.示例代码4.内容总结我们在上一章回中介绍了"FlutterCacheManager组件"相关的内容,本章回中将介绍一个加密工具包.闲话休提,让我们一起TalkFlutter吧。1.概念介绍加密主要是为了保护一些重要数据,我......
  • python PaddleOCR库用法及知识点详解
    识别图片的设置https://blog.csdn.net/f2315895270/article/details/128147744?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-128147744-blog-89082526.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_in......
  • 一文了带您了解 ES6 Class 用法
    文章目录一、概述二、用法2.1基础用法2.2封装与继承2.3继承一、概述ES6中的class是基于JavaScript中的一个强大的属性,也就是原型属性prototype,由这个属性改良得来的一种语法糖。在ES6中,class(类)作为对象的模板被引入,可以通过class关键字定义类。class的本......
  • 抓包工具tcpdump用法说明
    tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上。不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才会停止抓包。例如:shell>tcpdump-nn-ieth0icmp下面是详细的tcpdump用法。1.1tcpdump选项它的命令格式......
  • 响应式单位rpx及搭配UI产品工具和@import导入css样式和scss变量与用法static目录以及p
    1.响应式单位rpx及搭配UI产品工具1.对于rpx的认知和用法以及对于px的区别我们可以去官网先了解一下我们的rpx用法和注意以及与px的区别。链接:页面样式与布局|uni-app官网(dcloud.net.cn)我平时使用的px是我们的屏幕像素的单位,我们在一个页面创建一个view组件,并且给其在......
  • c# string库用法
    C#字符串(String)在C#中,您可以使用字符数组来表示字符串,但更常见的做法是使用string关键字来声明一个字符串变量。string关键字是System.String类的别名。1.String类的属性String类有以下两个属性:Chars在当前String对象中获取Char对象的指定位置。序号 属性1 C......
  • Numpy中reshape的用法
    目录语法介绍示例示例1示例2示例3示例4语法介绍numpy.reshape(a,newshape,order=‘C’)在不改变数据的情况下给数组一个新的形状。就是先将数组按给定索引顺序一维展开,然后按与展开时相同的索引顺序将展开的元素填充到新数组中;即等价于np.reshape(np.revel(arr......