easy_fastapi Python 后端开发框架

news2024/9/22 1:26:44

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

Easy FastAPI

基于 FastAPI 开发的后端框架,集成了 SQLAlchemy、Pydantic、Alembic、PyJWT、PyYAML、Redis 等插件,旨在提供一个高效、易用的后端开发环境。该框架通过清晰的目录结构和模块化设计,帮助开发者快速构建和部署后端服务。

在这里插入图片描述

一、主要特点

  1. 集成多种插件:集成了 SQLAlchemy(数据库 ORM)、Pydantic(数据验证和序列化)、Alembic(数据库迁移)、PyJWT(JWT 认证)、PyYAML(项目配置读取)、Redis(登出黑名单) 等常用插件,提升开发效率。
  2. 清晰的目录结构:通过明确的目录划分,如核心配置、数据库模型、路由、数据结构、事务处理和工具函数等,使项目结构清晰,便于维护和扩展。
  3. 认证授权:内置认证授权模块,支持 JWT 认证,保障系统安全。
  4. 数据库迁移支持:利用 Alembic 进行数据库迁移,支持自动生成迁移文件和更新数据库,确保数据库结构与代码同步。

二、目录结构说明

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. 安装依赖 cd backend/app && pip install -r requirements.txt
  2. 修改 backend/app/core/config.py 文件中 ROOT_NAME 常量值为项目根目录文件名
  3. 修改 backend/app/easy_fastapi.yaml 中相关配置
  4. 初始化数据库 alembic upgrade head
  5. 启动项目 cd backend && uvicorn app:app --reload --port 26029

四、数据库迁移插件 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/2094536.html

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

相关文章

GNU/Linux - Linux kernel memory access

User space memory access from the Linux kernel An introduction to Linux memory and user space APIs By M. Jones 10 August 2010 Archive date: 2023-08-31 虽然字节可能是 Linux 中内存的最低可寻址单位&#xff0c;但页面才是内存的可管理抽象。本文首先讨论 Linux …

cuda,torch,paddle向下兼容

1、第一次配置yolov9模型时&#xff0c;使用的cuda的版本是11.6&#xff0c;torch和torchvision都是对应版本的 使用的tensorrt版本8.6&#xff0c;可以正常跑yolov9 其它不动&#xff0c;直接将cuda版本换为cuda11.7&#xff0c;依然可以正常运行 2、paddleseg paddle同样安…

3.1 线性结构

令序列X、Y、Z的每个元素按顺序进栈&#xff0c;且每个元素进栈.出栈各一次&#xff0c;则不可能得到出栈序列&#xff08; &#xff09;。 A. XYZ B. XZY C. ZXY D. YZX 正确答案是 C。 解析 ZXY不可能得到这个序列&#xff0c;因为当Z最先出栈&#xff0c;说明X、Y已经入栈&a…

【FRP 内网穿透】

文章目录 一、什么叫内网穿透1、内网穿透技术的描述2、内网穿透技术的工作方式通常包括以下几个步骤 二、用内网穿透解决了什么问题三、常见的内网穿透解决方式1、FRP &#xff08;开源&#xff09;2、花生壳&#xff08;商业&#xff09;3、ZeroTier&#xff08;开源 商业&…

【js逆向专题】4.python调用JS和扣代码

小节目标: 掌握 python调用js代码方式熟悉 js开放接口进行调用了解 补环境的基本概念掌握 js调试技巧 一. pyexecjs的使用 1. 简介 PyExecJS 是一个 Python 库&#xff0c;用于在 Python 环境中执行 JavaScript 代码。它实际上是对 ExecJS 库的 Python 封装&#xff0c;Exec…

Spring数据类型转化

HTTP请求中携带的queryString和form-data数据&#xff08;文件除外&#xff09;都是是String类型。那么在Controller上怎么可以直接指定数据类型呢。其实是Spring默认帮我们做了类型转化。 内置数据类型转换器介绍 Converter<S, T> String -> Integer GetMapping(&…

c++ 146 三目运算符

const修饰指向的内存你空间不能被修改 c语言中的const冒牌货 符号表c 卸载 undief

AWTK 1.8 发布

1.8 版本更新 1. 细节完善 大量细节完善请参考 最新动态 2. 新增文档 拖入文件事件如何使用 packed image如何自定义资源加载方式如何使用 CMake 构建 AWTK 应用如何将资源编译到应用程序并使用它们关于自定义控件的 offset 的使用注意事项 3. 新增重要特性 使用 svgtiny 解…

斑马线识别检测系统源码分享

斑马线识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

MAC 、 IP ARP

MAC地址 基本概念 MAC地址是以太网的MAC子层所使用的地址——数据链路层 使用点对点信道的数据链路层不需要使用地址 使用广播信道的数据链路层必须使用地址来区分各主机 实现同一个广播信道上的不同主机之间的通信 每个主机都必须要有一个唯一的表示——一个数据链路层地址…

【计算机网络】应用层HTTP协议

我们已经实现过应用层协议&#xff0c;但也要看一看成熟的应用层协议 目录 1 HTTP协议11 URL12 urlencode 和 urldecode13 HTTP 协议请求与响应格式请求格式响应格式 14 界面的基本处理显示基本主页显示图片页面跳转 15 常见header16 状态码161 404举例162 关于3开头的状态码 1…

JavaEE 第20节 用TCP套接字实现简单回显服务器

这里写目录标题 一、API介绍ServerSocketSocket 二、创建简单的回显服务器服务器端客户端 一、API介绍 ServerSocket 构造方法 方法签名方法说明ServerSocket(int port)创建⼀个服务端流套接字Socket&#xff0c;并绑定到指定端⼝ 关于此构造方法的注意事项&#xff1a; Ser…

栈和队列的习题详解(1):有效的括号

前言&#xff1a; 在差不多二十天前小编写过栈和队列的详解&#xff0c;本来我想当时写完那两个结构之后就继续写它们的习题&#xff0c;但是写完那几篇博客以后&#xff0c;我就开始狂玩了十几天&#xff0c;我在上篇博客也说过&#xff0c;导致我在刚开学的时候就忘记了这个习…

mac的使用

mac使用python的问题 对于python的虚拟环境&#xff0c;其实是基于已经安装到本地的python来安装不同的包。&#xff08;之前我的mac上只安装了python3.9.6 &#xff0c;安装的位置为/usr/bin/python3&#xff09;然后我在vscode里怎么找都找不到如何弄一个python3.7.6 的版本…

使用Pywin32和其他库控制Office软件进行自动化操作

目录 引言 Pywin32概述 基本概念 安装与配置 基本使用 Word自动化操作 文档创建与编辑 文档格式化 宏的运行 PowerPoint自动化操作 演示文稿的创建与编辑 幻灯片内容的格式化 高级应用&#xff1a;从Word自动生成PPT 读取Word文档中的内容。 保存生成的PowerPoi…

NetSuite AI 图生代码

去年的ChatGPT热潮期间&#xff0c;我们写过一篇文章说GTP辅助编程的事。 NetSuite GPT的辅助编程实践_如何打开netsuite: html script notes的视图-CSDN博客文章浏览阅读2.2k次&#xff0c;点赞4次&#xff0c;收藏3次。作为GPT综合症的一种表现&#xff0c;我们今朝来探究下…

SOMEIP_ETS_076: Wrong_Method_ID

测试目的&#xff1a; 验证当设备&#xff08;DUT&#xff09;接收到一个包含错误方法ID的SOME/IP请求时&#xff0c;是否能够返回错误消息或忽略该请求。 描述 本测试用例旨在检查DUT在处理一个echoUINT8方法的SOME/IP消息时&#xff0c;如果消息中包含的方法ID不正确&…

NC 寻找峰值

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个长度…

12:以太网口模块布局

1.以太网口布局重点 ①两对差分线对应百兆网口&#xff0c;4对差分线对应千兆网口 ②以太网口重点是处理2对差分线&#xff0c;且优先走顶层 2.抽头信号要加粗&#xff1a;20mil-30mil

Unity学习路线

目录 一、Unity官方推荐路线二、AI总结的学习路线1、Unity学习路线图&#xff08;文言一心&#xff09;一、基础入门&#xff08;初级&#xff09;二、进阶提升&#xff08;中级&#xff09;三、高级深入&#xff08;高级&#xff09;四、专家级探索 注意事项 2、Unity学习路线…