FastAPI(21)- 多个模型的代码演进

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: FastAPI(21)- 多个模型的代码演进

前言


在一个完整的应用程序中,通常会有很多个相关模型,比如

  • 请求模型需要有 password
  • 响应模型不应该有 password
  • 数据库模型可能需要一个 hash 加密过的 password

 

多个模型的栗子


需求

  • 注册功能
  • 请求输入密码
  • 响应不需要输出密码
  • 数据库存储加密后的密码


 

实际代码

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/9/22 8:28 上午
# file: 19_extra models.py
"""
import uvicorn
from fastapi import FastAPI
from typing import Optional
from pydantic import BaseModel, EmailStr
app = FastAPI()
# 请求模型
class UserIn(BaseModel):
    username: str
    password: str
    email: EmailStr
    full_name: Optional[str] = None
# 响应模型
class UserOut(BaseModel):
    username: str
    email: EmailStr
    full_name: Optional[str] = None
# 数据库模型
class UserInDB(BaseModel):
    username: str
    hashed_password: str
    email: EmailStr
    full_name: Optional[str] = None
# 加密算法
def fake_password_hasher(password: str) -> str:
    return "supersecret" + password
# 数据库存储
def fake_save_user(user: UserIn):
    # 取出用户的密码进行加密
    hash_password = fake_password_hasher(user.password)
    # 转换为数据库模型
    userInDB = UserInDB(**user.dict(), hashed_password=hash_password)
    # 返回数据
    return userInDB
@app.post("/user", response_model=UserOut)
async def create_user(user: UserIn):
    # 创建用户,落库
    user_saved = fake_save_user(user)
    # 返回存储后的用户信息
    return user_saved
if __name__ == "__main__":
    uvicorn.run(app="19_extra_models:app", host="127.0.0.1", port=8080, reload=True, debug=True)


.dict()

是 Pydantic 提供的方法,将模型的实例对象转换为 dict

Pydantic 入门篇

 

**user.dict()

先将 user 转成 dict,然后解包

Python 解包教程

 

减少代码重复


核心思想

  • 减少代码重复是 FastAPI 的核心思想之一。
  • 因为代码重复增加了错误、安全问题、代码同步问题(当在一个地方更新而不是在其他地方更新时)等的可能性

 

上面代码存在的问题

三个模型都共享大量数据

 

利用 Python 继承的思想进行改造

  • 声明一个 UserBase 模型,作为其他模型的基础
  • 然后创建该模型的子类来继承其属性(类型声明、验证等),所有数据转换、验证、文档等仍然能正常使用
  • 这样,不同模型之间的差异(使用明文密码、使用哈希密码、不使用密码)也很容易识别出来


#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/9/22 8:28 上午
# file: 19_extra models.py
"""
import uvicorn
from fastapi import FastAPI
from typing import Optional
from pydantic import BaseModel, EmailStr
app = FastAPI()
# 基类模型
class UserBase(BaseModel):
    username: str
    email: EmailStr
    full_name: Optional[str] = None
# 请求模型
class UserIn(UserBase):
    password: str
# 响应模型
class UserOut(UserBase):
    pass
# 数据库模型
class UserInDB(UserBase):
    hashed_password: str
# 加密算法
def fake_password_hasher(password: str) -> str:
    return "supersecret" + password
# 数据库存储
def fake_save_user(user: UserIn):
    # 取出用户的密码进行加密
    hash_password = fake_password_hasher(user.password)
    # 转换为数据库模型
    userInDB = UserInDB(**user.dict(), hashed_password=hash_password)
    # 返回数据
    return userInDB
@app.post("/user", response_model=UserOut)
async def create_user(user: UserIn):
    # 创建用户,落库
    user_saved = fake_save_user(user)
    # 返回存储后的用户信息
    return user_saved
if __name__ == "__main__":
    uvicorn.run(app="19_extra models:app", host="127.0.0.1", port=8080, reload=True, debug=True)
相关文章
|
6月前
|
JSON API 持续交付
逐步指南:使用FastAPI部署YOLO模型的步骤
逐步指南:使用FastAPI部署YOLO模型的步骤
|
3月前
|
机器学习/深度学习 JSON API
【Python奇迹】FastAPI框架大显神通:一键部署机器学习模型,让数据预测飞跃至Web舞台,震撼开启智能服务新纪元!
【8月更文挑战第16天】在数据驱动的时代,高效部署机器学习模型至关重要。FastAPI凭借其高性能与灵活性,成为搭建模型API的理想选择。本文详述了从环境准备、模型训练到使用FastAPI部署的全过程。首先,确保安装了Python及相关库(fastapi、uvicorn、scikit-learn)。接着,以线性回归为例,构建了一个预测房价的模型。通过定义FastAPI端点,实现了基于房屋大小预测价格的功能,并介绍了如何运行服务器及测试API。最终,用户可通过HTTP请求获取预测结果,极大地提升了模型的实用性和集成性。
249 1
|
3月前
|
数据库连接 开发者 Python
从 Flask 迁移到 FastAPI,这简直是一场奇妙之旅!性能飙升,代码更优,快来感受这份惊喜!
【8月更文挑战第31天】作为一名开发者,从 Flask 迁移至 FastAPI 是一次充满挑战与收获的旅程。起初,Flask 的简洁性和灵活性吸引了我,但随着项目扩展,其性能局限性和较弱的类型提示支持逐渐显现。FastAPI 结合了 Flask 的简洁性和 Django 的强大功能,具备高性能、类型提示支持及自动文档生成等优势,更适合构建现代化 Web 应用。尽管迁移过程中需对现有代码进行调整,以适应 FastAPI 的类型提示和依赖注入机制,但最终应用性能和代码可维护性均显著提升,整个过程也大大提升了我的开发技能。
76 0
|
3月前
|
中间件 测试技术 持续交付
FastAPI测试秘籍:如何通过细致的测试策略确保你的代码在真实世界的挑战面前保持正确和稳定?
【8月更文挑战第31天】在软件开发中,测试至关重要,尤其在动态语言如Python中。FastAPI不仅简化了Web应用开发,还提供了强大的测试工具。通过`unittest`框架和Starlette测试客户端,开发者可以轻松编写和执行测试用例,确保每个功能按预期工作。本文将详细介绍如何设置测试环境、编写基础和高级测试用例,并探讨中间件和依赖项测试。此外,还将介绍如何在持续集成环境中自动化测试,确保代码质量和稳定性。利用FastAPI的测试工具,你可以构建出高效可靠的Web应用。
43 0
|
JSON Kubernetes API
使用FastAPI部署Ultralytics YOLOv5模型
YOLO是You Only Look Once(你只看一次)的缩写,它具有识别图像中的物体的非凡能力,在日常应用中会经常被使用。所以在本文中,我们将介绍如何使用FastAPI的集成YOLOv5,这样我们可以将YOLOv5做为API对外提供服务。
285 5
|
JSON NoSQL API
全面拥抱 FastApi — 响应模型
全面拥抱 FastApi — 响应模型
|
机器学习/深度学习 Python
【Python】fastapi框架之Web部署机器学习模型
【Python】fastapi框架之Web部署机器学习模型
|
JSON API 数据库
FastAPI(19)- Response Model 响应模型 (下)
FastAPI(19)- Response Model 响应模型 (下)
335 0
FastAPI(19)- Response Model 响应模型 (下)
|
JSON API 数据库
FastAPI(19)- Response Model 响应模型 (上)
FastAPI(19)- Response Model 响应模型 (上)
322 0
FastAPI(19)- Response Model 响应模型 (上)
下一篇
无影云桌面