PythonWeb基础-FastAPI使用

简介: FastAPI是一个基于Python的高性能Web框架,专为构建API接口服务设计。摘要涵盖以下核心内容:1)基础使用包括项目创建、路由定义和参数处理(路径/查询/请求体参数);2)请求响应机制支持JSON、HTML等多种格式;3)中间件和依赖注入实现通用逻辑复用;4)ORM数据库操作完整流程,包含模型定义、CRUD操作和复杂查询(条件/聚合/分页)。框架特性包括异步支持、自动数据验证、类型提示和交互式文档,显著提升开发效率和API性能。

 FastAPI是一个基于Python的高性能Web框架,用于快速构建API接口服务。FastAPI带有原生的异步支持,具备极高的性能。

1.框架基础使用

1.1 创建FastAPI项目

image.gif 编辑

创建虚拟环境是为了隔离项目运行环境,避免依赖冲突,保持全局环境的干净与稳定。

项目运行:

方式一:run项目

方式二:运行指令:uvicorn 模块名:app(应用实例名) --reload  ( --reload:更改代码后自动重启服务器)

访问交互式文档:

http://127.0.0.1:8000/docs

1.2 路由

路由就是URL地址与处理函数之间的映射关系,它决定了用户访问某个特定网址时,服务器应执行哪个后端接口来返回响应结果。

FastAPI的路由定义基于Python的装饰器模式:

image.gif 编辑

实例:

from fastapi import FastAPI
# 创建 FastAPI 实例
app = FastAPI()
@app.get("/lgh")
async def get_lgh():
    return {"data":"你好 吕贵浩"}

image.gif

image.gif 编辑

1.3 参数

参数就是客户端发送请求时附带的额外信息和指令,参数的作用就是让同一个接口能根据不同的输入,返回不同的输出,实现动态交互。同一段接口逻辑,根据参数不同返回不同的数据。

image.gif 编辑

1.3.1 路径参数

FastAPI允许为参数声明额外的信息和校验,通过导入FastAPI的Path函数实现。

from fastapi import FastAPI, Path
app = FastAPI()
# 需求:查找书籍的详情,路径参数 id,取值范围 1-100
@app.get("/book/{id}")
async def get_book(id: int = Path(..., gt=0, lt=101,
                                  description="书籍id,取值范围1-100")):
    return {"id": id, "title": f"这是第{id}本书"}
# 需求:查找书籍的作者,路径参数 name,长度范围 2-10
@app.get("/author/{name}")
async def get_name(name: str = Path(..., min_length=2, max_length=10)):
    return {"msg": f"这是{name}的信息"}

image.gif

1.3.2 查询参数

声明的参数不是路径参数时,路径操作函数会将该参数自动解释为查询参数。是同Query函数实现查询参数补充操作。

from fastapi import FastAPI, Query
app = FastAPI()
# 需求 查询新闻 → 分页,skip: 跳过的记录数, limit:返回的记录数 10
@app.get("/news/news_list")
async def get_news_list(
    skip: int = Query(0, description="跳过的记录数", lt=100),
    limit: int = Query(10, description="返回的记录数")
):
    return {"skip": skip, "limit": limit}

image.gif

1.3.3 请求体参数

创建类型并设计接口,借助Field添加类型注解。

from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
# 注册: 用户名和密码 → str
class User(BaseModel):
    username: str = Field(default="张三", min_length=2,
                          max_length=10, description="用户名,长度要求2-10个字")
    password: str = Field(min_length=3, max_length=20)
@app.post("/register")
async def register(user: User):
    return user

image.gif

1.4 请求与响应

1.4.1 响应类型

默认情况下,FastAPI 会自动将路径操作函数返回的 Python 对象(字典、列表、Pydantic 模型等),经由 jsonable_encoder 转换为 JSON 兼容格式,并包装为 JSONResponse 返回。这省去了手动序列化的步骤,让开发者能更专注于业务逻辑。如果需要返回非 JSON 数据(如 HTML、文件流),FastAPI 提供了丰富的响应类型来返回不同数据。

image.gif 编辑

1.4.2 相应类型设置方式

image.gif 编辑

HTML格式:

from fastapi import FastAPI
from fastapi.responses import HTMLResponse
app = FastAPI()
# 接口 → 响应 HTML 代码
@app.get("/html", response_class=HTMLResponse)
async def get_html():
    return "<h1>这是一级标题</h1>"

image.gif

文件格式:

from fastapi import FastAPI
from fastapi.responses import FileResponse
app = FastAPI()
# 接口: 返回一张图片内容
@app.get("/file")
async def get_file():
    path = "./files/1.jpeg"
    return FileResponse(path)

image.gif

自定义响应数据格式:

from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# 需求:新闻接口 → 响应数据格式 id、title、content
class News(BaseModel):
    id: int
    title: str
    content: str
@app.get("/news/{id}", response_model=News)
async def get_news(id: int):
    return {
        "id": id,
        "title": f"这是第{id}本书",
        "content": "这是一本好书"
    }

image.gif

response_model是路径操作装饰器(如@app.get或@app.post)的关键参数,它通过一个Pydantic模型来严格定义和约束API端点的输出格式。这一机制在提供自动数据验证和序列化的同时,更是保障数据安全性的第一道防线。

1.5 异常处理

image.gif 编辑

2.引入中间件与依赖注入

2.1 中间件

中间件(Middleware)是一个在每次请求进入 FastAPI 应用时都会被执行的函数。它在请求到达实际的路径操作(路由处理函数)之前运行,并且在响应返回给客户端之前再运行一次。

image.gif 编辑

中间件:函数顶部使用装饰器@app.middleware("http"),多个中间件的执行顺序是自下而上。

@app.middleware("http")
async def middleware2(request, call_next):
    print("中间件2 start")
    response = await call_next(request)
    print("中间件2 end")
    return response
@app.middleware("http")
async def middleware1(request, call_next):
    print("中间件1 start")
    response = await call_next(request)
    print("中间件1 end")
    return response

image.gif

2.2 依赖注入

使用依赖注入系统来共享通用逻辑,减少代码重复

from fastapi import FastAPI, Query, Depends  # 2. 导入 Depends
app = FastAPI()
# 分页参数逻辑共用: 新闻列表和用户列表
# 1. 依赖项
async def common_parameters(
    skip: int = Query(0, ge=0),
    limit: int = Query(10, le=60)
):
    return {"skip": skip, "limit": limit}
# 3. 声明依赖项 → 依赖注入
@app.get("/news/news_list")
async def get_news_list(commons=Depends(common_parameters)):
    return commons
@app.get("/user/user_list")
async def get_user_list(commons=Depends(common_parameters)):
    return commons

image.gif

image.gif 编辑

image.gif 编辑

image.gif 编辑

3.ORM

ORM(Object-RelationalMapping,对象关系映射)是一种编程技术,用于在面向对象编程语言和关系型数据库之间建立映射。它允许开发者通过操作对象的方式与数据库进行交互,而无需直接编写复杂的 SQL 语句。

优势:减少重复的 SQL 代码代码更简洁易读自动处理数据库连接和事务自动防止 SQL 注入攻击。

image.gif 编辑

ORM使用流程:

image.gif 编辑

3.1 建表

image.gif 编辑

from datetime import datetime
from fastapi import FastAPI, Depends
from sqlalchemy import DateTime, func, String, Float, select
from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
app = FastAPI()
# 1. 创建异步引擎
ASYNC_DATABASE_URL = "mysql+aiomysql://root:xxx@localhost:3306/fast_api?charset=utf8"
async_engine = create_async_engine(
    ASYNC_DATABASE_URL,
    echo=True,  # 可选,输出 SQL 日志
    pool_size=10,  # 设置连接池活跃的连接数
    max_overflow=20  # 允许额外的连接数
)
# 2. 定义模型类: 基类 + 表对应的模型类
# 基类:创建时间、更新时间;书籍表:id、书名、作者、价格、出版社
class Base(DeclarativeBase):
    create_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now, comment="创建时间")
    update_time: Mapped[datetime] = mapped_column(DateTime, insert_default=func.now(), default=func.now, onupdate=func.now(), comment="修改时间")
class Book(Base):
    __tablename__ = "book"
    id: Mapped[int] = mapped_column(primary_key=True, comment="书籍id")
    bookname: Mapped[str] = mapped_column(String(255), comment="书名")
    author: Mapped[str] = mapped_column(String(255), comment="作者")
    price: Mapped[float] = mapped_column(Float, comment="价格")
    publisher: Mapped[str] = mapped_column(String(255), comment="出版社")
# 3. 建表:定义函数建表 → FastAPI 启动的时候调用建表的函数
async def create_tables():
    # 获取异步引擎,创建事务 - 建表
    async with async_engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)  # Base 模型类的元数据创建
@app.on_event("startup")
async def startup_event():
    await create_tables()
@app.get("/")
async def root():
    return {"message": "Hello World"}

image.gif

3.2 在路由匹配中使用ORM

核心:创建依赖项,使用Depends注入到处理函数。

# 创建异步会话工厂
# 需求:查询功能的接口,查询图书 → 依赖注入:创建依赖项获取数据库会话 + Depends 注入路由处理函数
AsyncSessionLocal = async_sessionmaker(
    bind=async_engine,  # 绑定数据库引擎
    class_=AsyncSession,  # 指定会话类
    expire_on_commit=False  # 提交后会话不过期,不会重新查询数据库
)
# 依赖项
async def get_database():
    async with AsyncSessionLocal() as session:
        try:
            yield session  # 返回数据库会话给路由处理函数
            await session.commit()  # 提交事务
        except Exception:
            await session.rollback()  # 有异常,回滚
            raise
        finally:
            await session.close()  # 关闭会话
@app.get("/book/books")
async def get_book_list(db: AsyncSession = Depends(get_database)):
    # 查询
    result = await db.execute(select(Book))
    book = result.scalars().all()
    return book

image.gif

3.3 数据库操作

image.gif 编辑

3.3.1 查询

查询数据:

@app.get("/book/books")
async def get_book_list(db: AsyncSession = Depends(get_database)):
    # result = await db.execute(select(Book))  # 查询 → 返回一个 ORM 对象
    # book = result.scalars().all()  # 获取所有
    # book = result.scalars().first()  # 获取第一个
    book = await db.get(Book, 5)  # 获取单条数据 → 根据主键
    return book

image.gif

查询条件:

# 需求:路径参数 书籍id
@app.get("/book/get_book/{book_id}")
async def get_book_list(book_id: int, db: AsyncSession = Depends(get_database)):
    result = await db.execute(select(Book).where(Book.id == book_id))
    book = result.scalar_one_or_none()
    return book
# 需求:条件 价格大于等于200
@app.get("/book/search_book")
async def get_search_book(db: AsyncSession = Depends(get_database)):
    result = await db.execute(select(Book).where(Book.price >= 200))
    books = result.scalars().all()
    return books

image.gif

@app.get("/book/search_book")
async def get_search_book(db: AsyncSession = Depends(get_database)):
    # 需求: 作者以 曹 开头  % _
    # like() 模糊查询: % 任意个字符;_ 一个单个字符
    # result = await db.execute(select(Book).where(Book.author.like("曹_")))
    # & | ~ 与非
    # result = await db.execute(select(Book).where((Book.author.like("曹%")) | (Book.price > 100)))
    # in_() 包含
    # 需求:书籍id列表,数据库里面的 id 如果在 书籍id列表里面 就返回
    id_list = [1, 3, 5, 7]
    result = await db.execute(select(Book).where(Book.id.in_(id_list)))
    book = result.scalars().all()
    return book

image.gif

聚合查询:

@app.get("/book/count")
async def get_count(db: AsyncSession = Depends(get_database)):
    # 聚合查询 select( func.方法名(模型类.属性) )
    # result = await db.execute(select(func.count(Book.id)))
    # result = await db.execute(select(func.max(Book.price)))
    # result = await db.execute(select(func.sum(Book.price)))
    result = await db.execute(select(func.avg(Book.price)))
    num = result.scalar()  # 用来提取一个数值 → 标量值
    return num

image.gif

分页查询:

@app.get("/book/get_book_list")
async def get_book_list(
    page: int = 1,
    page_size: int = 3,
    db: AsyncSession = Depends(get_database)
):
    # (页码 - 1) * 每页数量
    skip = (page - 1) * page_size
    # offset 跳过的记录数  ; limit 每页的记录数
    stmt = select(Book).offset(skip).limit(page_size)
    result = await db.execute(stmt)
    books = result.scalars().all()
    return books

image.gif

查询总结:

image.gif 编辑

image.gif 编辑

3.3.2 新增数据

# 需求:用户输入图书信息(id、书名、作者、价格、出版社) → 新增
# 用户输入 → 参数 → 请求体
class BookBase(BaseModel):
    id: int
    bookname: str
    author: str
    price: float
    publisher: str
@app.post("/book/add_book")
async def add_book(book: BookBase, db: AsyncSession = Depends(get_database)):
    # ORM对象 → add → commit
    book_obj = Book(**book.__dict__)
    db.add(book_obj)
    await db.commit()
    return book

image.gif

3.3.3 修改数据

@app.put("/book/update_book/{book_id}")
async def update_book(book_id: int, data: BookUpdate, db: AsyncSession = Depends(get_database)):
    # 1. 查找图书
    db_book = await db.get(Book, book_id)
    # 如果未找到 抛出异常
    if db_book is None:
        raise HTTPException(
            status_code=404,
            detail="查无此书"
        )
    # 2. 找到了则修改:重新赋值
    db_book.bookname = data.bookname
    db_book.author = data.author
    db_book.price = data.price
    db_book.publisher = data.publisher
    # 3. 提交到数据库
    await db.commit()
    return db_book

image.gif

3.3.4 删除数据

@app.delete("/book/delete_book/{book_id}")
async def delete_book(book_id: int, db: AsyncSession = Depends(get_database)):
    # 先查再删 提交
    db_book = await db.get(Book, book_id)
    if db_book is None:
        raise HTTPException(
            status_code=404,
            detail="查无此书"
        )
    await db.delete(db_book)
    await db.commit()
    return {"msg": "删除图书成功"}

image.gif


相关文章
|
7月前
|
存储 算法 JavaScript
OAuth2协议与微信扫码登录实战
本文介绍了OAuth2协议及其在微信扫码登录中的应用实现。OAuth2是一种开放、安全的授权标准,支持授权码、密码等多种模式,其中授权码模式被微信扫码登录采用。文章详细解析了微信扫码登录流程:用户扫码授权→获取授权码→换取令牌→获取用户信息→完成登录。技术实现方面,使用JWT令牌解决认证服务与资源服务间的校验问题,并提供了完整的后端接口设计(包括获取授权URL、处理回调等)和前端测试页面代码。系统通过网关进行统一认证,各微服务自行处理授权,确保安全性的同时提高性能。整体方案实现了基于OAuth2协议的无缝第
1093 1
|
JavaScript 中间件 测试技术
FastAPI全面指南:从入门到企业级应用实战
FastAPI正迅速成为Python Web开发领域的明星框架。它以高性能、高效率和现代化特性著称,性能媲美Go/Node.js,支持异步编程并内置自动化文档系统。本文全面解析FastAPI核心功能,包括类型安全路由、Pydantic数据验证、异步支持等,并通过实战案例展示其在RESTful API开发、微服务架构、实时数据处理及机器学习模型部署中的应用。同时,文章提供数据库集成、中间件配置和测试策略等最佳实践,解决常见问题并展望未来技术发展方向。掌握FastAPI,助你构建高效现代化Web应用。
2473 1
|
7月前
|
消息中间件 JavaScript 前端开发
详解事件循环与浏览器渲染机制
摘要:浏览器采用多进程架构,渲染主线程通过事件循环机制处理HTML解析、样式计算、布局等任务。异步机制避免主线程阻塞,任务按优先级在微队列、交互队列等不同队列中调度。JS执行会阻碍渲染,因其与渲染任务共享主线程。渲染流程包含解析、样式计算、布局、分层等阶段,最终由合成线程和GPU完成绘制。transform效率高因其仅影响合成阶段,不涉及主线程。reflow是布局重计算,repaint是绘制指令更新,两者均影响性能。
|
7月前
|
消息中间件 Dubbo Java
深入剖析RocketMQ2-实战案例
本文介绍了一个基于电商场景的订单和支付系统实现方案。系统采用SpringBoot+Dubbo+Zookeeper+RocketMQ技术栈,重点解决分布式系统中的数据一致性问题。在订单模块,通过预订单生成、库存扣减、优惠券使用、余额扣减等步骤完成下单流程,并利用RocketMQ实现失败补偿机制。支付模块处理第三方支付回调,通过消息队列异步更新订单状态。系统通过分布式事务保证数据一致性,采用线程池优化消息发送性能,并提供完整的测试方案验证系统功能。本文详细阐述了技术架构、数据库设计、核心业务流程以及异常处理机制
|
7月前
|
机器学习/深度学习 人工智能 算法
做大模型应用所需的一点点基础数学理论(神经网络基础)
神经网络的灵感来源于生物学,人工智能的进步与生物学发展紧密相关。其核心组成部分神经元,通过模拟生物神经元的工作方式进行信息处理。神经网络由一系列神经元构成激活函数是神经网络中的关键,属于非线性化函数。它能针对不同输入值x产生不同输出值y,通过训练不断调整权重值(w)和偏移参数(b),实现预期的分类效果。深度神经网络包含多层神经元。训练时,投喂大量数据样本,不断修正权重值(参数),使整个运算功能达到预期值。
|
7月前
|
消息中间件 存储 Kafka
详解Kafka1-基础使用
Kafka消息队列技术指南 本文系统介绍了Kafka消息队列的核心概念与应用实践。主要内容包括: 消息队列基础 两种模型:生产者-消费者模型和发布-订阅模型 应用场景:异步处理、系统解耦、流量削峰等 Kafka核心架构 重要组件:Broker、Zookeeper、Topic、Partition等 消费者组机制实现负载均衡 消息存储与分区策略 实践操作 集群搭建与环境配置 基准测试方法与性能指标 Java API编程示例(生产者/消费者) 事务编程实现原子操作 高级特性 生产者幂等性原理与配置 事务API与隔
|
7月前
|
机器学习/深度学习 存储 人工智能
大模型应用开发1-认识大模型
摘要: 本文系统介绍了大模型的基础概念、本地部署及API调用方法。首先阐述了AI及神经网络的基本原理,重点解析了Transformer架构及其在大语言模型(LLM)中的应用。其次详细对比了三种模型使用方案(开放API/云部署/本地部署)的优缺点,并以Ollama为例演示了本地部署流程,包括模型管理、交互指令和GPU加速配置。最后说明了大模型API调用规范,列举了主流大模型产品及其应用场景,强调大模型在自然语言处理、内容生成等领域的优势,以及与传统编程结合开发智能应用的可能性。全文涵盖技术原理到实践操作,为大
|
7月前
|
人工智能 自然语言处理 Java
大模型应用开发5-SpringAIalibaba实战
本文介绍了SpringAIAlibaba开源项目,该项目基于SpringAI构建,为阿里云通义系列模型提供Java开发实践。主要内容包括: 基础使用:配置模型API、依赖引入、调用示例,支持同步和流式调用; 多种集成方式:对接本地Ollama模型、ChatClient高级API、SSE流式输出; 核心功能实现:提示词模板、结构化输出、持久化内存、文本生成图片/语音; 高级能力:向量数据库、RAG增强检索、工具调用(Tool Calling); MCP协议:标准化工具调用方案,实现服务端工具共享;
1201 4
|
7月前
|
存储 监控 前端开发
大文件上传下载处理方案-断点续传,秒传,分片,合并
本文介绍了大文件上传下载的断点续传技术方案。上传方面,通过前端将大文件分块(如5MB/块),后端使用MinIO存储分块并合并,实现断点续传和秒传功能。下载方面,采用Range请求分片下载,前端合并分片触发下载。技术要点包括:1)前端分块计算MD5;2)后端MinIO存储管理;3)分片校验与合并;4)进度监控和异常处理。该方案解决了大文件传输中断问题,提升用户体验,适用于视频等大文件传输场景,完整代码示例包含前后端实现。
|
7月前
|
存储 人工智能 NoSQL
大模型应用开发3-LangChain4j实战
本文介绍了LangChain4j框架的使用方法,主要包括以下内容:1. 基础配置:创建SpringBoot项目并配置OpenAI聊天模型;2. AIServices工具类:简化模型调用,支持流式和阻塞式两种调用方式;3. 会话记忆功能:实现多轮对话记忆,支持会话隔离和Redis持久化存储;4. RAG检索增强:通过向量数据库存储和检索专业领域知识,提升大模型回答质量;5. Tools工具:通过Function Calling机制实现业务功能调用。文章详细讲解了每个功能的实现步骤,包括代码示例和配置方法,帮助
2473 3

热门文章

最新文章