easy_fastapi 后端开发框架

news2024/9/19 20:19:31

GitHub easy_fastapi by one-ccs
遵循 MIT 开源协议

Easy FastAPI

基于 FastAPI 开发的后端框架,集成 SQLAlchemy、Pydantic、Alembic、PyJWT 等插件。

在这里插入图片描述

一、目录结构说明

project-root/
│
├─ backend/  # 后端项目目录(python 3.12.4)
│   ├─ app/      # fastapi 项目目录
│   │   ├─ alembic/  # 数据迁移目录
│   │   │   ├─ versions   # 数据库迁移版本文件
│   │   │   ├─ env.py     # 环境配置文件
│   │   │   ├─ ...
│   │   │
│   │   ├─ core/  # 核心配置文件
│   │   │   ├─ exceptions/   # 异常类目录
│   │   │   │   ├─ *_exception.py        # 自定义异常类
│   │   │   │   ├─ ...
│   │   │   │
│   │   │   ├─ authorization.py     # 认证授权相关配置
│   │   │   ├─ config.py            # 项目配置
│   │   │   ├─ db.py                # 数据库配置
│   │   │   ├─ exception_handler.py # 错误处理器
│   │   │   ├─ redis.py             # redis 配置
│   │   │   ├─ result.py            # 响应体数据类
│   │   │   ├─ yaml.py              # yaml 配置
│   │   │
│   │   ├─ models/     # 数据库模型目录
│   │   │   ├─ crud         # 数据库 crud 函数目录
│   │   │   │   ├─ *_crud.py        # 对应类的数据库操作函数
│   │   │   │   ├─ ...
│   │   │   │
│   │   │   ├─ *.py         # 数据库模型(user、role 等)
│   │   │   ├─ ...
│   │   │
│   │   ├─ routers/    # 路由目录(定义路由相关信息)
│   │   │   ├─ *_router.py  # 路由(user_router、role_router 等)
│   │   │   ├─ ...
│   │   │
│   │   ├─ schemas/    # pydantic 数据结构目录(定义请求响应参数结构)
│   │   │   ├─ *_schema.py  # 参数结构定义
│   │   │   ├─ ...
│   │   │
│   │   ├─ services/   # 事务处理目录(实现路由对应的逻辑)
│   │   │   ├─ *_service.py # 事务逻辑处理函数(user_service 等)
│   │   │   ├─ ...
│   │   │
│   │   ├─ utils/      # 工具函数目录
│   │   │   ├─ crud_utils # 数据库 crud 工具函数
│   │   │   │   ├─ datetime_util.py # 日期时间相关工具类
│   │   │   │   ├─ object_util.py   # 对象相关工具类
│   │   │   │   ├─ path_util.py     # 路径相关工具类
│   │   │   │   ├─ string_util.py   # 字符串相关工具类
│   │   │   │   ├─ ...
│   │   │
│   │   ├─ __init__.py      # 导入路、初始化配置、导入错误处理
│   │   ├─ alembic.ini      # 数据库迁移配置文件
│   │   ├─ easy_fastapi.py  # 配置文件
│   │   ├─ main.py          # 程序入口
│   │   ├─ requirements.txt # 依赖列表
│   │
│   ├─ db/ # 数据库文件目录
│   │   ├─  easy_fastapi.sql
│
├─ frontend/ # 前端项目目录
│   │ ...
│
├─ license   # MIT 开源协议
├─ readme.md # 工程自述
├─ ...

二、部署

  1. 安装依赖
  2. 修改 backend/app/core/config.py 文件中 ROOT_NAME 常量值为项目根目录文件名
  3. 修改 backend/app/easy_fastapi.yaml 中相关配置
  4. 初始化数据库
  5. 启动项目

三、数据库迁移插件 alembic

1、环境搭建

1)初始化仓库

在后端项目目录中执行命令 alembic init alembic 创建一个名为 alembic 的仓库

2)创建(ORM)类

略……

3)修改配置文件
  1. 注释 alembic.ini 中的 sqlalchemy.url
  2. 修改 eny.py 文件
# fileConfig(config.config_file_name)
fileConfig(config.config_file_name, encoding='utf-8')
# target_metadata = None
import sys
sys.path.append(__file__[:__file__.index('backend') + len('backend')])
from app.models import Base
from app.core import config as app_config

target_metadata = Base.metadata
def get_url():
    return app_config.DATABASE_URI


def run_migrations_offline() -> None:
    """Run migrations in 'offline' mode.

    This configures the context with just a URL
    and not an Engine, though an Engine is acceptable
    here as well.  By skipping the Engine creation
    we don't even need a DBAPI to be available.

    Calls to context.execute() here emit the given string to the
    script output.

    """
    url = get_url()
    context.configure(
        url=url,
        target_metadata=target_metadata,
        literal_binds=True,
        dialect_opts={"paramstyle": "named"},
    )

    with context.begin_transaction():
        context.run_migrations()


def run_migrations_online() -> None:
    """Run migrations in 'online' mode.

    In this scenario we need to create an Engine
    and associate a connection with the context.

    """
    configuration = config.get_section(config.config_ini_section)
    configuration["sqlalchemy.url"] = get_url()
    connectable = engine_from_config(
        configuration,
        prefix="sqlalchemy.",
        poolclass=pool.NullPool,
    )

    with connectable.connect() as connection:
        context.configure(
            connection=connection, target_metadata=target_metadata
        )

        with context.begin_transaction():
            context.run_migrations()

2、迁移

1)生成迁移文件

使用命令 alembic revision --autogenerate -m "message" 可以将当前模型中的状态生成迁移文件。

2)更新数据库

使用 alembic upgrade head 将刚刚生成的迁移文件,真正映射到数据库中。同理,如果要降级,那么使用 alembic downgrade head

3)重复

如果以后修改了代码,则重复4~5的步骤。

3、回退迁移

1)回退到指定版本

使用命令 alembic downgrade <version> 回退到指定版本。

2)回退到上一个版本

使用命令 alembic downgrade -1 回退到上一个版本。

3)回退到初始版本

使用命令 alembic downgrade base 回退到初始版本。

4、命令和参数解释:

  • init:创建一个 alembic 仓库。
  • revision:创建一个新的版本文件。
  • –-autogenerate:自动将当前模型的修改,生成迁移脚本。
  • -m:本次迁移做了哪些修改,用户可以指定这个参数,方便回顾。
  • upgrade:将指定版本的迁移文件映射到数据库中,会执行版本文件中的 upgrade 函数。如果有多个迁移脚本没有被映射到数据库中,那么会执行多个迁移脚本。
  • [head]:代表最新的迁移脚本的版本号。
  • downgrade:会执行指定版本的迁移文件中的 downgrade 函数。
  • heads:展示head指向的脚本文件版本号。
  • history:列出所有的迁移版本及其信息。
  • current:展示当前数据库中的版本号。

另外,在你第一次执行 upgrade 的时候,就会在数据库中创建一个名叫 alembic_version 表,这个表只会有一条数据,记录当前数据库映射的是哪个版本的迁移文件

5、常见问题

1、编码错误

Q: UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xa8 in position 2516: illegal multibyte sequence
A:将 site-packages\alembic\util\compat.pyread_config_parser 改为如下

def read_config_parser(
    file_config: ConfigParser,
    file_argument: Sequence[Union[str, os.PathLike[str]]],
) -> List[str]:
    if py310:
        return file_config.read(file_argument, encoding="utf-8")
    else:
        return file_config.read(file_argument)

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

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

相关文章

微信小程序背景图无法显示

文章目录 不知道有没有人跟我一样&#xff0c;刚接触微信小程序&#xff0c;在写代码的时候&#xff0c;背景图莫名奇妙不显示。 网上有很多解决方法&#xff0c;比如转 base64 &#xff0c;网络图片地址等等&#xff0c;但我觉得都太麻烦了&#xff0c;这里直接给出我的解决方…

Unity实战案例全解析 之 背包/贩卖/锻造系统(左侧类图实现)

物品类 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Item {#region 物品类的基础属性public int ID { get; set; }public string Name { get; set; }public Typeitem typeitem { get; set; }//物品类型public Qualityitem…

VMware17 虚拟机使用NAT模式上网配置

1、. 确认网络适配器选择NAT模式 2、 查看所需要配置的网络信息 在NAT设置里面找到网关ip 在DHCP设置中查看可用ip的范围 后面设置虚拟机的etc/sysconfig/network-scripts/下面的ens文件会用到 查看网卡名称 ip addr 我这里的网卡名称是ens33 配置网关、ip地址、DNS地址 vi…

[线程]单例模式 及 指令重排序

文章目录 一. 单例模式饿汉模式懒汉模式单例模式中涉及到的线程安全问题 二. 指令重排序引起线程安全问题 一. 单例模式 单例模式, 是一种经典的设计模式 设计模式: 类似于棋谱, 把编程中各种经典的问题场景给你盘一盘, 并给出一下解决方案 遇到这种场景, 代码就这样写, 绝对不…

Linux和Unix的区别及为什么鸿蒙系统不用Unix的原因

目录 Linux是什么? Unix是什么&#xff1f; 他们的区别&#xff1a; 鸿蒙系统介绍及鸿蒙系统不用Unix的原因 Linux是什么? Linux的历史可以追溯到1991年&#xff0c;由芬兰的计算机科学家林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;为了学习操作系统的工作原理而…

【 OpenHarmony 系统应用源码魔改 】-- Launcher 之「桌面布局定制」

前言 阅读本篇文章之前&#xff0c;有几个需要说明一下&#xff1a; 调试设备&#xff1a;平板&#xff0c;如果你是开发者手机&#xff0c;一样可以加 Log 调试&#xff0c;源码仍然是手机和平板一起分析&#xff1b;文章中的 Log 信息所显示的数值可能跟你的设备不一样&…

STM32GPIO操作底层解析

我们使用HAL 和 标准库时&#xff0c;常常忽略他两的底层&#xff0c;只知道怎么用不知其原理&#xff0c;其实是大忌&#xff0c;因为底层丢了代码的灵魂就丢了&#xff0c;对以后的Linux开发不利 常用的指令函数&#xff1a; void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint…

本地编写Markdown格式文件,浏览器查看

编写准备 下载VsCode并安装&#xff0c;打开后在内部安装Markdown All in One、Markdown Preview Enhanced、Paste Image三个插件。新建一个文件夹用以后期保存你的笔记等文件在左侧新建文件&#xff0c;.md结尾&#xff0c;即完成创建右侧可实时的查看你的编写结果&#xff0…

SpringBoot3集成Spring Authorization Server实现SSO单点登录

1. 概述 在之前的文章中介绍过SpringBoot集成OAuth2老版本的方案SpringCloud搭建微服务之OAuth2实现SSO单点登录&#xff0c;随着Spring Authorization Server框架的成熟和SpringBoot版本的更新&#xff0c;新项目必然会采用新的技术和框架&#xff0c;本文将使用最新的Spring…

推理引擎测试-算力共享:test_inference_engine

目录 算力共享:test_inference_engine 关键点解释 实际应用和注意事项 算力共享:test_inference_engine 这段代码设计用于测试一个名为 InferenceEngine 的推理引擎,特别是测试其在处理不同分片(Shards)时的连续性和一致性。在机器学习和深度学习模型中,尤其是当模型非…

jenkins+python+appium 本地(简洁版)

jenkinspythonappium 本地&#xff08;简洁版&#xff09; 等服务器到了配到服务器上去&#xff0c;先在自己电脑上试一下。踩了n个坑&#xff0c;网上找的资料太深奥TAT 直接上操作 先把jenkins安装好&#xff08;肯定安装啦&#xff09;我的版本是2.462 新建任务 输入名称 选…

市占率最高的显示器件,TFT_LCD的驱动系统设计--Part 1

目录 一、简介 二、TFT-LCD驱动系统概述 &#xff08;一&#xff09;系统概述 &#xff08;二&#xff09;设计要点 二、扫描驱动电路设计 &#xff08;一&#xff09;概述 扫描驱动电路的功能 扫描驱动电路的组成部分 设计挑战 驱动模式 &#xff08;二&#xff09…

互联网全景消息(1)之RabbitMq基础入门

一、消息中间件 1.1消息队列回顾 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实 现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ &a…

js插件-模糊搜索、自动补全下拉框

问题&#xff1a;一个老系统&#xff0c;让把所有jsp页面动态生成的<select>下拉选&#xff0c;选项过多的下拉选全部改为支持模糊搜索的下拉选的功能。系统框架只有 jq 和layui&#xff08;仅用于列表和弹窗&#xff09;&#xff0c; JQurey 首先想到的就是jQuery UI …

构建以数据为核心智慧型工业园区新架构方案

1. 项目背景与目标 智慧型工业园区新架构的构建旨在通过数据驱动实现节能、绿色、高效和安全的目标&#xff0c;以应对当前工业园区在基础数据收集、系统管理和操作复杂性方面的挑战。 2. 现状分析 当前工业园区的发展面临数据收集难题、系统分散、操作复杂以及孤岛效应&…

前端面试——八股文

一、Vue2篇 1. 关于生命周期 1.1 生命周期有哪些&#xff1f;发送请求在created还是mounted&#xff1f; 请求接口测试&#xff1a;https://fcm.52kfw.cn/index.php?_mall_id1&rapi/default/districtVue2.x系统自带有8个 beforeCreate created beforeMount mounted be…

电子签合同区块链存证合约小程序开源版开发

电子签合同区块链存证合约小程序开源版开发 电子合同底层对接的腾讯电子签接口&#xff0c;支持自定义模版发起合同和文件发起合同&#xff0c;支持骑缝章&#xff0c;多方签署&#xff0c;腾讯至信链提供区块链存证&#xff0c;安全高效签署合同文书。 特色功能 自定义合同模…

(计算机论文)基于SpringBoot和Vue的台球赛事服务网站的设计与实现

毕业设计&#xff08;论文&#xff09; 博主可接毕设论文&#xff01;&#xff01;&#xff01; 基于SpringBoot和Vue的台球赛事服务网站的设计与实现 摘 要 在快速发展的信息时代&#xff0c;体育竞赛作为群众文化娱乐的一部分&#xff0c;已日益受到广泛关注。台球&#xff…

Windows—线程基本知识和线程同步

线程 线程的组成 线程的内核对象&#xff0c;操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。线程堆栈&#xff0c;它用于维护线程在执行代码时需要的所有函数参数和局部变量 线程的进入点 每个线程必须拥有一个进入点函数&#xff0c;线程从…

备战2024年全国大学生数学建模竞赛:多波束测线问题的解题与优化

目录 一、引言 二、问题分析 三、解题思路与模型建立 问题1&#xff1a;覆盖宽度及重叠率计算 问题2&#xff1a;不同测线方向的覆盖宽度 问题3&#xff1a;最短测线的设计 问题4&#xff1a;基于单波束数据的测线设计 四、知识点解析 五、结果讨论与总结 六、模型的评…