news 2026/8/16 21:36:07

FastApi进阶

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FastApi进阶

中间件

中间件是一个再每次请求进入fastapi时都会执行的函数,他在请求到达实际路径操作之前执行,并且再相应返回客户端之前再运行一次,执行顺序按代码顺序自底向上执行

具体使用

@app.middleare("http") async def middleare(request,call_next): print("中间件开始处理 -- start") response = await call_next(request) print("中间件处理完成 -- end") return response

依赖注入系统

可以用来共用通用逻辑,减少代码重复,具体场景如下

使用步骤

1.创建依赖项

async def common_paremeters( skip: int = Query(0,ge=0), limit: int = Query(10,le=60) ): return { "skip":skip, "limit":limit }

2.导入Depends

from fastapi import Depends

3.声名依赖项

@app.get("news/news_list") async def get_news_list( commons = Depends(common_parameters) ): return commons

ORM简介

ORM是一种操作数据库的编程技术,用于再面向对象编程语言和关系数据库之间建立映射

使用流程

使用ORM

创建异步数据库引擎

from sqlalchemy.ext.asyncio import create_async_engine # 异步MySQL连接地址(驱动为aiomysql) ASYNC_DATABASE_URL = "mysql+aiomysql://root:123456@localhost:3306/lol?charset=utf8" # 创建异步数据库引擎 async_engine = create_async_engine( ASYNC_DATABASE_URL, echo=True, # 可选:打印执行的原生SQL日志,开发调试开启,生产关闭 pool_size=10, # 连接池常驻持久连接数量 max_overflow=20 # 连接池额外临时扩容最大连接数 )

定义模型类

包含

1.基类 -- 包含通用属性字段的映射

class Base(DeclarativeBase): create_time: Mapped[datetime] = mapped_column( Datetime, insert_default=func.now(),default=datetime.now,comment="创建时间") update_time: Mapped[datetime] = mapped_column( Datetime, insert_default=func.now(),default=datetime.now,comment="修改时间")

2.定义数据表对应的模型类

class Book(Base): __tablename__="book" id:Mapped[int] = mapped_column(primary_key=True) bookname:Mapped[str] = mapped_column(String(255)) author:Mapped[str] = mapped_column(String(255))

3.创建数据库表

async def create_tables(): async with async_engine.begin() as conn: await conn.run_sync(Base.matadata.create_all) @app.on_event("startup") async def startup_event(): await create_tables()

路由匹配中使用ORM

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

AsyncSessionLocal = async_sessionmaker( bind=async_engine,#绑定数据引擎 class_=AsyncSession,#制定会话类 expire_on_commit=False#会话对象不过期,不重新查询数据库 ) async def get_db(): async with AsyncSessionLocal() as session: try: yield session await session.commit() except Exception as e: await session.rollback() raise e finally: await session.close()

使用依赖

@app.get("/book/news_list") async def get_book(db: AsyncSession = Depends(get_db)): result = await db.execute(select(Book)) return result.scalars().all()

数据库操作

查询

核心语句

await db.execute(select(模型类))#返回一个ORM对象 #获取所有数据 scalars().all() #获取单条数据 scalars().first() get(模型类,主键值)

条件查询

@app.get("/book/list", response_model=list[BookSchema]) async def get_book_list( author: str = Query(None, description="Filter by author"), bookname: str = Query(None, description="Filter by bookname"), db: AsyncSession = Depends(get_db) ): query = select(Book) if author: query = query.where(Book.author.like(f"%{author}%")) if bookname: query = query.where(Book.bookname.like(f"%{bookname}%")) result = await db.execute(query) return result.scalars().all()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/16 21:35:43

一文速通GPU版FFmpeg视频转码的安装使用

目录 写在前面 一、FFmpeg 版本 二、完整安装步骤 1. 安装编译依赖 2.安装nv-codec-headers SDK 12.0 3.如果需要 x264/x265(软件编码备用) 4. 下载 FFmpeg 6.0 源码 5. 配置编译选项 6. 编译并安装 三、 验证安装 1.查看FFmpeg版本 2.检查 N…

作者头像 李华
网站建设 2026/8/16 21:31:43

传统BIOS引导黑苹果实战:老硬件安装macOS Monterey完整指南

1. 项目缘起:为什么今天还要折腾传统BIOS引导的黑苹果?如果你在2024年还在搜索“黑苹果传统BIOS引导安装”,大概率和我当初一样,手里正攥着一台有些年头的“老伙计”。它可能是陪伴你度过大学时光的“神船”,也可能是公…

作者头像 李华
网站建设 2026/8/16 21:31:35

无线传输模块概述

以下按主流技术路线分类,逐一讲解无线传输模块的技术特征、适用场景、价格区间与典型案例。所有价格为 2025-2026 年国内市场参考值,受采购批量、封装等级、认证资质影响会有波动,标注均附数据来源。 一、WiFi 无线模块(含 WiFi + 蓝牙二合一) 1. 核心技术特征 工作频段:…

作者头像 李华
网站建设 2026/8/16 21:29:26

Python 快速上手(Java 开发者版)

笔者本人是有 Java 基础,这篇文档只讲 Python 的不同之处和刷题/开发中最实用的东西。 目录 环境搭建 语法速览:一张表看懂 Java vs Python 内置数据结构(刷题核心) 列表推导式 & 生成器(Python 大招&#xff0…

作者头像 李华