FastAPI 快速开发 Web API 项目:在 FastAPI 应用程序中构建项目结构(上)

目录

前言

在前面的文章中,我们介绍了 FastAPI 的基础功能和创建一个基本 FastAPI 应用程序的基本步骤:创建虚拟环境,安装 FastAPI、定义模型、定义路由、模板文件以及连接 MySQL 数据库和对模型数据的操作。然而,在我们学习的过程中,新建一个简易的应用程序是很简单,容易上手,但是如果随着复杂性和功能的不断完善,仅仅靠随意组织的项目结构,可能导致逻辑架构混乱,后期维护困难,因此需要对大型程序或者项目进行适当的结构设计。

结构化指的是以有组织的格式安排应用程序组件,这些组件可以是模块化的,以提高应用程序代码和内容的可读性。具有合理结构化的应用程序可以加快开发速度、加快调试速度,全面提高工作效率。

之前的项目结构:

文件结构化

一般来说,文件结构化是您在计算机上组织信息的方式。就编程这一项而言,麻省理工学院和哈佛大学的博德研究所将文件结构描述为以可重复性为前提组织代码。它使任何有权访问项目的人都可以更轻松地浏览项目文件。文件结构构建了一个框架,通过将内容分成文件夹层次结构,从而来显示不同内容的用途。

文件结构化的一个主要优点是,它们能使定位和访问文件变得更加容易。有了定位文件的能力,开发人员就能够更快地完成更多工作。编程中的文件结构使开发人员能够知道文件在哪里、何时使用特定代码并查询相关结果。文件结构不仅可以提高生产力,还可以提高代码的一致性和可共享性。

FastAPI 应用文件结构化

比如,我们定义了如下的应用结构:

matlab 复制代码
todo
├── main.py
├── database/
    ├── __init__.py
    └── connection.py
├── routers/
    ├── __init__.py
    └── events.py
    └── users.py
├── models/
    ├── __init__.py
    └── events.py
    └── users.py

第一步,新建一个应用的文件夹,命名为 todo(待办事项):

bash 复制代码
$ mkdir todo && cd todo

然后根据结构创建对应的 main.py 文件,对应的子文件夹: databaseroutesmodels

bash 复制代码
$ touch main.py
$ mkdir database routes models

为每一个文件夹创建 __init__.py 文件:

bash 复制代码
$ touch {database,routes,models}/__init__.py

为 models 和 routers 文件夹,创建两个相同命名的文件 event.pyusers.py

bash 复制代码
touch {routes,models}/{events,users}.py
  • 在 models 文件夹下
    • event.py 文件将会定义所有待办事项的操作的模型定义
    • users.py 文件将会包括用户操作的模型定义
  • 在 routers 文件夹下
    • event.py 文件将处理路由操作,如创建、更新和删除事件、 和删除事件等路由操作
    • users.py 文件将处理路由操作,如用户注册和登录

其他文件同理,这里就不过多介绍了。最终的文件目录结构如下:

创建一个待办清单应用程序

我们将创建一个 Todo 应用程序。在这个应用程序中,注册用户可以创建、更新和删除待办事项。创建的事件可以通过导航到应用程序自动创建的事件详情页面进行查看。

像之前的文章一样,为我们的新项目创建一个虚拟环境,并在当前项目目录下激活这个虚拟环境。

bash 复制代码
$ pip install virtualenv
$ virtualenv venv
$ source venv/Scripts/activate

如果虚拟环境激活成功,如下图所示:

接着,我们安装必须的依赖库:

bash 复制代码
$ pip install fastapi uvicorn "pydantic[email]"

保存所有的依赖库到 requirements.txt 文件中:

bash 复制代码
$ pip freeze > requirements.txt
(venv) 

我们已经成功安装了我们的依赖项并设置好了开发环境。

实现模型

建立应用程序的第一步是为待办事项和用户定义模型。这些模型描述了如何在应用程序中存储、输入和展示数据。下图显示了用户和代码事项模型之间的关系:

  1. 定义 Event 模型,在 models/events.py 中写入如下代码:
python 复制代码
from typing import List
from pydantic import BaseModel
from datetime import datetime


class Event(BaseModel):
    id: int
    title: str
    description: str
    tags: List[str]
    time: datetime.datetime
    location: str
    image: str


    class Config:
        schema_extra = {
            "example": {
                "title": "Leaning Python FastAPI",
                "description": "Create a project by FastAPI",
                "tags": ["python", "fastapi", "programming"],
                "time": "2013-01-01 00:00:00",
                "location": "Libary No.1",
                "image": "https://xxx.com/xxx.png"
            }
        }
        

让我们在待办事件类下定义一个 Config 子类,举例说明访问文档时模型数据的样子。

第一个代码块中的事件模型包含 6 个字段:

  • 待办事件标题
  • 描述
  • 标签(用于分组)
  • 时间
  • 地点
  • 图片(链接)
  1. 定义 User 模型,在 models/users.py 中写入如下代码:
python 复制代码
from typing import Optional, List
from pydantic import BaseModel, EmailStr
from models.events import Event


class User(BaseModel):
    email: EmailStr
    password: str
    events: Optional[List[Event]]


    class Config:
        schema_extra = {
            "example": {
                "email": "[email protected]",
                "username": "djkfhj85adGD#$4!",
                "events": [],
            }
        }

       
class UserSignIn(BaseModel):
    email: EmailStr
    password: str

    schema_extra = {
        "example": {
            "email": "[email protected]",
            "password": "djkfhj85adGD#$4!",
        }
    }

代码解释如下,用户模型包括下面的字段:

  • 用户的邮箱
  • 用户的密码
  • 用户创建的事件列表,默认为空

现在我们已经定义了用户模型,让我们创建一个示例来说明 如何存储和设置用户数据:

python 复制代码
class Config:
        schema_extra = {
            "example": {
                "email": "[email protected]",
                "username": "djkfhj85adGD#$4!",
                "events": [],
            }
        }

接下来,我们将创建一个新模型 NewUser,它继承自 User 模型;这个新模型将在注册新用户时用作数据类型。在我们不想与密码交互的情况下,User 模型将被用作响应模型,从而减少工作量。

最后,让我们实现一个用户登录模型:

python 复制代码
class UserSignIn(BaseModel):
    email: EmailStr
    password: str

    schema_extra = {
        "example": {
            "email": "[email protected]",
            "password": "djkfhj85adGD#$4!",
        }
    }

总结

至此,基于我们在介绍完项目结构化之后,实现了在 FastAPI 创建一个最小项目结构,并实现了相应的模型,下一篇将介绍如何实现路由,完成完整的项目应用。

希望本文能对你有所帮助,如果喜欢本文,可以点个关注。

下一篇文章见!宇宙古今无有穷期,一生不过须臾,当思奋争。

相关推荐
bobz9656 分钟前
ovs patch port 对比 veth pair
后端
Asthenia041216 分钟前
Java受检异常与非受检异常分析
后端
uhakadotcom30 分钟前
快速开始使用 n8n
后端·面试·github
JavaGuide37 分钟前
公司来的新人用字符串存储日期,被组长怒怼了...
后端·mysql
bobz9651 小时前
qemu 网络使用基础
后端
Asthenia04121 小时前
面试攻略:如何应对 Spring 启动流程的层层追问
后端
Asthenia04121 小时前
Spring 启动流程:比喻表达
后端
Asthenia04122 小时前
Spring 启动流程分析-含时序图
后端
ONE_Gua2 小时前
chromium魔改——CDP(Chrome DevTools Protocol)检测01
前端·后端·爬虫
致心2 小时前
记一次debian安装mariadb(带有迁移数据)
后端