目录
- 第一篇: 通过 Python FastAPI 开发一个快速的 Web API 项目
- 第二篇: FastAPI 的路由介绍与使用
- 第三篇: FastAPI 开发中数据校验利器 Pydantic 介绍与集成使用
- 第四篇: FastAPI 快速开发 Web API 项目: 路径参数和查询参数
- 第五篇: 从 Flask 转换到 FastAPI(翻译)
- 第六篇: FastAPI 快速开发 Web API 项目: 响应模型与错误处理
- 第七篇: FastAPI 快速开发 Web API 项目: 模板和 Jinja 介绍
- 第八篇: FastAPI 快速开发 Web API 项目: 连接 MySQL 数据库
- 第九篇: FastAPI 快速开发 Web API 项目: 通过 SQLAlchemy 进行数据操作
- 第十篇: FastAPI 快速开发 Web API 项目:FastAPI 中的最小项目
- 第十一篇: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
文件,对应的子文件夹: database
、routes
、models
bash
$ touch main.py
$ mkdir database routes models
为每一个文件夹创建 __init__.py
文件:
bash
$ touch {database,routes,models}/__init__.py
为 models 和 routers 文件夹,创建两个相同命名的文件 event.py
和 users.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)
我们已经成功安装了我们的依赖项并设置好了开发环境。
实现模型
建立应用程序的第一步是为待办事项和用户定义模型。这些模型描述了如何在应用程序中存储、输入和展示数据。下图显示了用户和代码事项模型之间的关系:
- 定义 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 个字段:
- 待办事件标题
- 描述
- 标签(用于分组)
- 时间
- 地点
- 图片(链接)
- 定义 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": "test123@outlook.com",
"username": "djkfhj85adGD#$4!",
"events": [],
}
}
class UserSignIn(BaseModel):
email: EmailStr
password: str
schema_extra = {
"example": {
"email": "test123@outlook.com",
"password": "djkfhj85adGD#$4!",
}
}
代码解释如下,用户模型包括下面的字段:
- 用户的邮箱
- 用户的密码
- 用户创建的事件列表,默认为空
现在我们已经定义了用户模型,让我们创建一个示例来说明 如何存储和设置用户数据:
python
class Config:
schema_extra = {
"example": {
"email": "test123@outlook.com",
"username": "djkfhj85adGD#$4!",
"events": [],
}
}
接下来,我们将创建一个新模型 NewUser,它继承自 User 模型;这个新模型将在注册新用户时用作数据类型。在我们不想与密码交互的情况下,User 模型将被用作响应模型,从而减少工作量。
最后,让我们实现一个用户登录模型:
python
class UserSignIn(BaseModel):
email: EmailStr
password: str
schema_extra = {
"example": {
"email": "test123@outlook.com",
"password": "djkfhj85adGD#$4!",
}
}
总结
至此,基于我们在介绍完项目结构化之后,实现了在 FastAPI 创建一个最小项目结构,并实现了相应的模型,下一篇将介绍如何实现路由,完成完整的项目应用。
希望本文能对你有所帮助,如果喜欢本文,可以点个关注。
下一篇文章见!宇宙古今无有穷期,一生不过须臾,当思奋争。