架构基础 -- Web框架之FastAPI

FastAPI:背景与使用案例介绍

FastAPI的背景

FastAPI是一个现代、快速(高性能)的Web框架,基于Python 3.7+编写,利用Python的类型提示(type hints)来实现自动生成文档和高效的数据验证。由Sebastián Ramírez在2018年发布,FastAPI的设计目标是尽可能高效地开发API,特别适用于需要高性能的应用,如微服务架构、实时数据处理和机器学习应用。

FastAPI的核心是基于Starlette作为其Web框架底层,并使用Pydantic进行数据模型验证。通过这种组合,FastAPI可以处理复杂的数据验证和序列化,同时保持代码的简洁和易读。其主要特点包括:

  1. 高性能:FastAPI的性能非常高,接近于同样使用Python的其他高性能框架,如Sanic和Uvicorn。
  2. 自动生成文档:FastAPI能够通过Swagger UI和Redoc自动生成漂亮且实用的API文档,减少文档编写工作量。
  3. 类型安全:利用Python 3.7+的类型提示,FastAPI可以在开发时提供类型安全和智能代码补全,同时进行自动数据验证。
  4. 支持异步编程:FastAPI天然支持异步编程,能够处理高并发请求。

FastAPI的使用案例

1. Uber的MICRO定价系统

Uber使用FastAPI来构建其部分MICRO服务,尤其是在处理实时定价系统时。FastAPI的高性能和异步特性使得它能够在短时间内处理大量并发请求,确保乘客和司机能够获得准确和实时的价格信息。

2. Netflix的内部工具

Netflix在内部使用FastAPI构建了一些工具和服务。这些工具用于数据科学和机器学习团队的日常工作,包括数据处理、模型预测和任务自动化等。FastAPI的类型提示和自动文档生成功能帮助开发者在开发和维护这些工具时更高效、更准确。

3. Exploding Topics API

Exploding Topics是一个通过分析趋势来发现新兴话题的网站。该平台使用FastAPI来提供API服务,帮助客户访问这些趋势数据。由于FastAPI的高效性和自动文档生成功能,Exploding Topics团队能够快速迭代开发,并为客户提供稳定、快速的API接口。

4. Sentiment Analysis API

一个使用FastAPI的情感分析API项目,允许用户通过提交文本数据来获取该文本的情感分析结果。该API集成了预训练的自然语言处理模型(如BERT),通过FastAPI对外提供服务。FastAPI的高性能处理能力确保了即使在高并发的情况下,API依然能提供快速的响应。

5. ML模型部署

某公司开发了一套用于金融数据预测的机器学习模型,并使用FastAPI将这些模型部署到生产环境。通过FastAPI提供的API,用户可以上传输入数据并获取预测结果。FastAPI支持的异步请求和自动生成的Swagger文档使得这套系统既高效又易于使用。

6. 视频处理服务

一个视频处理和转换平台使用FastAPI来管理视频文件的上传、处理(如格式转换、剪辑等)和下载。FastAPI的异步处理能力能够很好地支持这种高I/O的操作场景,确保视频文件能够迅速处理并提供给用户。

7. IoT设备管理

某公司使用FastAPI开发了一个用于管理和监控IoT设备的后台系统。这个系统通过API来收集和处理大量设备的状态数据,并执行控制指令。FastAPI提供的高并发处理能力确保系统能够实时监控和控制大量的IoT设备。

8. 个人博客系统

开发者使用FastAPI构建了一个个人博客系统,支持文章的创建、编辑、删除和展示。通过FastAPI的路径参数和请求体支持,这个博客系统能够快速处理各种请求,同时集成的Swagger文档让用户可以轻松了解API的使用方法。

9. 数据可视化平台

一个数据科学团队使用FastAPI搭建了一个内部的数据可视化平台,允许用户通过API上传数据并生成各种图表。FastAPI的快速开发能力帮助团队在短时间内推出了这个平台,并支持后续的功能扩展。

10. 身份验证和授权服务

FastAPI被用于构建一个身份验证和授权服务,负责处理用户登录、注册、权限管理等功能。该服务使用OAuth2标准,并通过FastAPI对外提供安全、快速的API接口。

FastAPI用户注册与登录系统示例

概述

本文档展示了如何使用FastAPI创建一个简单的用户注册和登录系统。这个系统包含了用户的注册、登录以及获取当前用户信息的功能,并通过JWT令牌来管理用户的身份验证。

依赖安装

在开始编写代码之前,需要安装以下依赖库:

pip install fastapi uvicorn pydantic passlib bcrypt python-jose

代码示例

以下是完整的代码示例:

from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel, EmailStr
from typing import Optional
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from passlib.context import CryptContext
from jose import JWTError, jwt
from datetime import datetime, timedelta# FastAPI应用实例
app = FastAPI()# 密码加密解密工具
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")# OAuth2 密码流
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")# 模拟的数据库
fake_users_db = {}# 密钥和算法
SECRET_KEY = "a1b2c3d4e5f6g7h8i9j0k"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30# Pydantic 模型定义
class User(BaseModel):username: stremail: EmailStrfull_name: Optional[str] = Nonedisabled: Optional[bool] = Noneclass UserInDB(User):hashed_password: strclass UserCreate(BaseModel):username: stremail: EmailStrpassword: str# 密码加密和验证
def verify_password(plain_password, hashed_password):return pwd_context.verify(plain_password, hashed_password)def get_password_hash(password):return pwd_context.hash(password)# 获取用户信息
def get_user(db, username: str):if username in db:user_dict = db[username]return UserInDB(**user_dict)# 验证用户
def authenticate_user(fake_db, username: str, password: str):user = get_user(fake_db, username)if not user:return Falseif not verify_password(password, user.hashed_password):return Falsereturn user# 生成访问令牌
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):to_encode = data.copy()if expires_delta:expire = datetime.utcnow() + expires_deltaelse:expire = datetime.utcnow() + timedelta(minutes=15)to_encode.update({"exp": expire})encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)return encoded_jwt# 注册用户接口
@app.post("/register")
async def register(user: UserCreate):if user.username in fake_users_db:raise HTTPException(status_code=400, detail="Username already registered")hashed_password = get_password_hash(user.password)fake_users_db[user.username] = {"username": user.username, "email": user.email, "full_name": user.full_name, "hashed_password": hashed_password}return {"message": "User registered successfully"}# 生成令牌接口
@app.post("/token")
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):user = authenticate_user(fake_users_db, form_data.username, form_data.password)if not user:raise HTTPException(status_code=400,detail="Incorrect username or password",headers={"WWW-Authenticate": "Bearer"},)access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)access_token = create_access_token(data={"sub": user.username}, expires_delta=access_token_expires)return {"access_token": access_token, "token_type": "bearer"}# 获取当前用户信息接口
@app.get("/users/me", response_model=User)
async def read_users_me(token: str = Depends(oauth2_scheme)):credentials_exception = HTTPException(status_code=401,detail="Could not validate credentials",headers={"WWW-Authenticate": "Bearer"},)try:payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])username: str = payload.get("sub")if username is None:raise credentials_exceptionexcept JWTError:raise credentials_exceptionuser = get_user(fake_users_db, username=username)if user is None:raise credentials_exceptionreturn user

代码说明

  1. 用户注册:使用/register接口,用户可以注册并创建账号。用户的密码会通过bcrypt加密存储在模拟数据库中。

  2. 用户登录:使用/token接口,用户可以通过用户名和密码获取访问令牌(JWT)。这个令牌在后续的请求中将用于验证用户身份。

  3. 获取用户信息:使用/users/me接口,用户可以通过提供JWT令牌来获取自己的信息。令牌验证通过后,API会返回用户信息。

运行方式

  1. 安装依赖:

    pip install fastapi uvicorn pydantic passlib bcrypt python-jose
    
  2. 运行服务器:

    uvicorn main:app --reload
    
  3. 在浏览器中访问http://127.0.0.1:8000/docs,你将看到自动生成的Swagger UI文档,可以直接在文档中测试注册、登录和获取用户信息的API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 入门指南:Java 并发编程 —— 线程安全问题与锁机制

线程安全的概念 线程安全可以简单理解为在多线程环境下,一个方法或实例在并发执行时能够保持数据的一致性和完整性,不会因为多个线程的交替执行而导致错误的结果。 线程不安全的原因 线程不安全通常由以下几个原因引起: 原子性问题&#x…

ncnn之yolov5(7.0版本)目标检测pnnx部署

一、pnxx介绍与使用 pnnx安装与使用参考: https://github.com/pnnx/pnnxhttps://github.com/Tencent/ncnn/wiki/use-ncnn-with-pytorch-or-onnxhttps://github.com/Tencent/ncnn/tree/master/tools/pnnx 支持python的首选pip,否则就源码编译。 pip3 …

【60天备战软考高级系统架构设计师——第四天:需求获取与初步分析】

软件开发的成功与否往往取决于需求分析的准确性和全面性。今天,我们将深入学习需求获取的各种方法及初步分析的策略,为构建成功的软件项目打下坚实基础。 需求获取方法 需求获取是软件工程中非常重要的阶段,它帮助开发团队深入了解用户的需…

美团8/31—24年秋招【技术】第四场

有10道选择题和3道编程题,选择题以数据结构和计算机网络的知识点为主,编程题只做出了前2道,第三道没时间了,这里记录一下解答过程。 第一题 题目描述 给定一字符串,统计字符串中意大写字母开头的子串的数量&#xf…

mysql实用系列:查询语句开启分页

在 Spring Boot 项目中使用 MyBatis 分页插件&#xff08;PageHelper&#xff09;的步骤如下&#xff1a; 添加依赖&#xff1a;在项目的 pom.xml 文件中添加 PageHelper 的依赖。 <dependency><groupId>com.github.pagehelper</groupId><artifactId>…

Leetcode面试经典150题-36-有效数独升级版-37.解数独

解法都在代码里&#xff0c;不懂就留言或者私信&#xff0c;比第一题稍微难点 public static void solveSudoku(char[][] board) {/**定义三个二维数组分别代表行、列、桶&#xff08;每9个格子&#xff09;*/boolean[][] rowExists new boolean[9][10];boolean[][] colExist…

穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

1.为什么要继承 2.什么是继承以及继承的方式 3.继承的一些语法 4.父类成员的访问 5.关键字super 6.关键字protected 7.关键字final 8.继承与组合 一&#xff1a;为什么要继承 ①代码重用&#xff1a;继承允许我们重用、扩展或修改父类的属性和方法&#xff0c;而无需重…

【linxu】虚拟环境中Python 版本错乱:深入探究 Linux 虚拟环境的识别问题

【linxu】虚拟环境中Python 版本错乱&#xff1a;深入探究 Linux 虚拟环境的识别问题 问题描述&#xff1a;在服务器上&#xff0c;我配置了一个虚拟环境&#xff0c;明确指定使用 Python 3.8 版本。然而&#xff0c;当我激活该环境并检查 Python 版本时&#xff0c;意外地发现…

Golang中的timer和ticker

Golang中的timer和ticker Timer func AppTimer() {// st : time.Now()// // 创建timer&#xff0c;定时2s// timer : time.NewTimer(2 * time.Second)// timer.Stop()// //<-timer.C// timer.Reset(3 * time.Second)// <-timer.C// fmt.Println(time.Since(st))// Afte…

21. Map接口中keySet()、values()和entrySet()方法的区别是什么?它们各自返回什么内容?

在Java中&#xff0c;Map接口提供了keySet()、values()和entrySet()方法&#xff0c;这些方法用于访问Map中的不同部分。下面详细介绍它们的区别以及它们各自返回的内容。 1. keySet() 方法 作用: keySet()方法返回Map中所有键&#xff08;Key&#xff09;的集合。 返回类型: …

OSI七层模型中的数据链路层

图片&#xff1a;数据帧的格式 这里面的一个关键点是&#xff0c;数据的源IP和目标IP在哪里&#xff1f; 就在图中的“数据”里面&#xff0c;这个“数据”也就是网络层的数据包&#xff0c;如果是TCP类型的数据包&#xff0c;数据包里面就包含TCP类型的首部信息&#xff0c;…

实测数据处理(RD算法处理)——SAR成像算法系列(十)

系列文章目录 《SAR学习笔记-SAR成像算法系列&#xff08;一&#xff09;》 《距离多普勒算法&#xff08;RDA&#xff09;-SAR成像算法系列&#xff08;三&#xff09;》 文章目录 一、算法流程 1.1、回波信号生成 1.2、 距离脉冲压缩 1.3、距离徙动校正 1.4、方位脉冲压缩 …

midwayjs 框架使用 rabbitmq 消息延迟

插件rabbitmq_delayed_message_exchange是RabbitMQ官方提供的一种用于实现延迟消息的解决方案。该插件将交换机类型扩展至x-delayed-message&#xff0c;这种类型的交换机能够将消息暂时挂起&#xff0c;直到设定的延迟时间到达&#xff0c;才将消息投递到绑定的队列中。这一特…

代理 IP 在工业物联网中的大作用

随着科技的飞速发展&#xff0c;工业物联网&#xff08;IIoT&#xff09;已经成为现代工业的重要组成部分&#xff0c;它通过将各种物理设备、传感器、控制系统等通过互联网连接起来&#xff0c;实现了工业生产的智能化、自动化和远程监控。而在这个庞大的网络体系中&#xff0…

掌握CHECK约束:确保数据准确性的关键技巧

掌握CHECK约束&#xff1a;确保数据准确性的关键技巧 在数据库设计和管理中&#xff0c;数据的准确性和完整性至关重要。CHECK约束是SQL中一种强大的工具&#xff0c;用于限制列中的数据值&#xff0c;确保它们满足特定的条件。本文将详细介绍如何使用CHECK约束&#xff0c;并…

湖南师范大学教育科学学报

期刊名称&#xff1a; 湖南师范大学教育科学学报 国内统一刊号(CN)&#xff1a; 42-94 国际标准刊号(ISSN)&#xff1a;BM1712 刊物设有两大特色专题“古典教育”和“教科书研究”&#xff0c;常设“教育基本理论研究”、“教育哲学研究”、“教师教育研究”、“高等教育研究”…

Nginx跨域问题解决

背景&#xff1a;云服务器上面部署了后端和前端&#xff0c;前端开发在本地启一个web访问页面&#xff0c;然后访问云服务的后端&#xff0c;然后出现问题 问题&#xff1a;Access to XMLHttpRequest at ‘http://192.168.10.100:8070/auth/login’ from origin ‘http://loca…

[E二叉树] lc104. 二叉树的最大深度(dfs+自顶向下)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;104. 二叉树的最大深度 题单&#xff1a; 链表、二叉树与一般树&#xff08;前后指针/快慢指针/DFS/BFS/直径/LCA&#xff09; 2.2 自顶向下 DFS 2. 题目解析 思路&#xff1a; 很基础的 dfs 题目哈&#x…

k8s单master多node环境搭建-k8s版本低于1.24,容器运行时为docker

k8s 1.20.6单master多node环境搭建 1.环境规划2.初始化服务器1&#xff09;配置主机名2&#xff09;设置IP为静态IP3&#xff09;关闭selinux4&#xff09;配置主机hosts文件5&#xff09;配置三台主机之间免密登录6&#xff09;关闭交换分区swap&#xff0c;提升性能7&#xf…

github源码指引:C++嵌入式WEB服务器

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 相关专题&#xff1a; C嵌入式…