FastAPI(六十五)实战开发《在线课程学习系统》基础架构的搭建

在之前三篇,我们分享的就是需求的分析,基本接口的整理,数据库链接的配置。这次我们分享项目的基本框架,目录结构大致如下:

common目录:
        通用目录,放一些通用的处理

models目录:

        数据库表模型放在这里(你也可以把数据库相关的都放在这个目录下)

routers目录:

        放所有接口的地方

test目录:

        放测试用例的地方

settings目录:
        放配置文件的地方

middlewares目录:

        放所有中间件的地方,比如mysql,redis,mongodb等(主要是数据库操作相关)

Dockerfile:

        docker打包文件

main:

        程序运行主文件

整体的架构设计完毕后,就可以进行相关开发了,这里我们把之前设计的数据库模型相关放到modles目录下的modles.py下:

"""
-*- encoding=utf-8 -*-
Time: 2024/7/19 14:18
Author: lc
Email: 15101006331@163.com
File: models.py
"""
from sqlalchemy import Column, Integer, String, ForeignKey, Boolean, Text, DateTime
from sqlalchemy import MetaData
from sqlalchemy.inspection import inspect
from datetime import datetimefrom sqlalchemy.orm import DeclarativeMetafrom middlewares.mysql.database import Base, engineclass Role(Base):"""角色"""__tablename__ = "roles"id = Column(Integer, primary_key=True, index=True)name = Column(String(length=8), unique=True, index=True)  # 角色名称class User(Base):"""用户基础表"""__tablename__ = "users"id = Column(Integer, primary_key=True, index=True)username = Column(String(length=32), unique=True, index=True)  # 用户名password = Column(String(length=252))  # 密码status = Column(Integer, default=0)  # 删除,0正常job_num = Column(Integer, nullable=True)  # 工号student_num = Column(Integer, nullable=True)  # 学号age = Column(Integer)  # 年龄sex = Column(String(length=8), default="男")  # 性别role = Column(Integer, ForeignKey('roles.id'))  # 角色add_time = Column(DateTime, default=datetime.now())class Course(Base):"""课程"""__tablename__ = "courses"id = Column(Integer, primary_key=True, index=True)name = Column(String(length=252), unique=True, index=True)  # 课程名称icon = Column(String(length=252), nullable=True)  # icondesc = Column(String(length=252), nullable=True)  # 描述status = Column(Boolean, default=False)  # 状态onsale = Column(Boolean, default=False)  # 是否上架catalog = Column(Text, nullable=True)  # 目录owner = Column(Integer, ForeignKey('users.id'))  # 拥有者like_num = Column(Integer, default=0)  # 点赞class StudentCourse(Base):"""学生课程"""__tablename__ = "student_courses"id = Column(Integer, primary_key=True, index=True)student = Column(Integer, ForeignKey('users.id'))  # 学生course = Column(Integer, ForeignKey('courses.id'))  # 课程add_time = Column(DateTime, default=datetime.now())update_time = Column(DateTime, default=datetime.now())status = Column(Integer, default=0)  # 1.删除,0.正常class CourseComment(Base):"""课程评论"""__tablename__ = "course_comments"id = Column(Integer, primary_key=True, index=True)course = Column(Integer, ForeignKey('courses.id'))  # 课程user = Column(Integer, ForeignKey('users.id'))  # 评论人pid = Column(Integer)  # 回复add_time = Column(DateTime, default=datetime.now())top = Column(Boolean, default=False)  # 是否置顶context = Column(Text)status = Column(Boolean, default=0)  # 1删除0正常class Message(Base):__tablename__ = "messages"id = Column(Integer, primary_key=True, index=True)send_user = Column(Integer, ForeignKey('users.id'))  # 发送者accept_user = Column(Integer, ForeignKey('users.id'))  # 接收者read = Column(Boolean, default=False)  # 是否已读,接收者是否已读send_time = Column(String(length=252))  # 发送时间pid = Column(Integer)  # 回复者add_time = Column(DateTime, default=datetime.now())  # 添加时间context = Column(Text)status = Column(Integer, default=0)  # 1删除0正常def create_tables():global_dict = globals()classes = [vfor k, v in global_dict.items()if callable(v) and isinstance(v, DeclarativeMeta) and hasattr(v, "__tablename__")]metadata = MetaData()for _cls in classes:if not inspect(engine).has_table(_cls.__tablename__, schema=None, metadata=metadata):_cls.__table__.create(bind=engine)print(f"表:‘{_cls.__tablename__}’ 创建完成!")else:print(f"表:‘{_cls.__tablename__}’ 已存在!")if __name__ == '__main__':create_tables()

之前配置的链接mysql数据库的配置放在对应的database.py中

"""
-*- encoding=utf-8 -*-
Time: 2024/7/19 14:22
Author: lc
Email: 15101006331@163.com
File: database.py
"""
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, sessionmaker
from settings.config import MYSQL_CONFIGconn = "mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8".format(username=MYSQL_CONFIG["username"], password=MYSQL_CONFIG["password"], host=MYSQL_CONFIG["host"],port=MYSQL_CONFIG["port"], database=MYSQL_CONFIG["database"])
engine = create_engine(conn)# 该类的每个实例都是一个数据库会话,该类本身还不是数据库会话,但是一旦我们创建了SessionLocal的实例,这个实例将是实际的数据库会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)# 创建数据库基类
Base = declarative_base()def create_db():"""每个请求处理完毕后关闭当前连接,不同的请求使用不同的链接"""db = SessionLocal()try:yield dbfinally:db.close()

接下来我们的开发只需要关注主逻辑的处理即可,准备放到对应的crud.py和schemas.py文件中,其中crud主要是逻辑处理详细代码,schemas中主要是参数模型以及响应结果模型。

common中我们对json和log做了统一的处理,对应可以参考:

FastAPI 学习之路(五十九)封装统一的json返回处理工具

FastAPI 学习之路(六十)打造系统的日志输出

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

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

相关文章

比较HTTP/1.1、HTTP/2

HTTP/1.1和HTTP/2是两个不同版本的超文本传输协议(HTTP),它们在多个方面存在显著的差异。以下是对这两个协议的比较: 一、连接管理 HTTP/1.1: 使用持久连接(Persistent Connections)&#xff…

【基础】模拟题 角色授权类

3413. DHCP服务器 题目 提交记录 讨论 题解 视频讲解 动态主机配置协议(Dynamic Host Configuration Protocol, DHCP)是一种自动为网络客户端分配 IP 地址的网络协议。 当支持该协议的计算机刚刚接入网络时,它可以启动一个 DHCP 客户…

【Git远程操作】克隆远程仓库 https协议 | ssh协议

目录 前言 克隆远程仓库https协议 克隆远程仓库ssh协议 前言 这四个都是Git给我们提供的数据传输的协议,最常使用的还是https和ssh协议。本篇主要介绍还是这两种协议。 ssh协议:使用的公钥加密和公钥登录的机制(体现的是实用性和安全性&am…

Nginx的HA高可用的搭建

1. 什么是高可用 高可用(High Availability, HA)是一种系统设计策略,旨在确保服务或应用在面对硬件故障、软件缺陷或任何其他异常情况时,仍能持续稳定地运行。它通过实现冗余性、故障转移、负载均衡、数据一致性、监控自动化、预防…

【无线通信】射频杂散(RF Spurious Emissions)

射频杂散(RF Spurious Emissions)是指在无线通信系统中,除了在指定频率范围内的预期信号之外,任何不需要的或非预期的射频信号。这些杂散信号可能会干扰其他通信系统,降低系统性能,并违反无线电通信法规。射…

掌握构建艺术:在Gradle中配置自定义的源代码管理(SCM)

掌握构建艺术:在Gradle中配置自定义的源代码管理(SCM) 在软件开发过程中,源代码管理(Source Code Management,简称SCM)是不可或缺的一部分。它帮助开发者管理代码的变更历史,支持团…

Go网络编程-HTTP程序设计_2

HTTP程序设计 Go编写HTTP服务器,用 Go实现一个 http server非常容易,Go 语言标准库 net/http自带了一系列结构和方法来帮助开发者简化 HTTP 服务开发的相关流程。因此,我们不需要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。…

React Router 6笔记

一个路由就是一个映射关系 key为路径,value可能是function或component 路由分类 后端路由(node) value是function,用来处理客户端提交的请求注册路由:router.get(path, function(req, res))工作过程:当…

Java并发04之线程同步机制

文章目录 1 线程安全1.1 线程安全的变量1.2 Spring Bean1.3 如果保证线程安全 2 synchronized关键字2.1 Java对象头2.1.1 对象组成部分2.1.2 锁类型2.1.3 锁对象 2.2 synchronized底层实现2.2.1 无锁状态2.2.2 偏向锁状态2.2.3 轻量级锁状态2.2.4 重量级锁2.2.5 锁类型总结2.2.…

C++11 容器emplace方法刨析

如果是直接插入对象 push_back()和emplace_back()没有区别但如果直接传入构造函数所需参数&#xff0c;emplace_back()会直接在容器底层构造对象&#xff0c;省去了调用拷贝构造或者移动构造的过程 class Test { public:Test(int a){cout<<"Test(int)"<<…

链表(4) ----跳表

跳表&#xff08;Skip List&#xff09;是一种随机化的数据结构&#xff0c;用于替代平衡树&#xff08;如 AVL 树或红黑树&#xff09;。它是基于多层链表的&#xff0c;每一层都是上一层的子集。跳表可以提供与平衡树相似的搜索性能&#xff0c;即在最坏情况下&#xff0c;搜…

zlgcan,周立功Can设备,Qt中间件,QtCanBus插件,即插即用

新增zlgcan插件&#xff0c;需要请看下方视频回复联系&#xff01; 视频链接地址&#xff1a; Qt,canbus manager,周立功,zlgcan插件演示,需要请留言_哔哩哔哩_bilibili

反爬虫策略中的IP地址轮换如何实现?挑战与对策

当今互联网时代&#xff0c;各类网站、网络平台背后隐藏着大量数据&#xff0c;广告数据收集、市场数据收集都需要依托爬虫技术&#xff0c;但很多网站通过反爬虫技术限制或屏蔽爬虫的访问&#xff0c;这给数据收集带来不小的挑战。 为了规避这些反爬虫策略&#xff0c;开发人…

JVM--内存分配与回收策略

1.前言 对象的内存分配&#xff0c;从概念上讲&#xff0c;应该都是在堆上分配&#xff08;而实际上也有可能经过即时编译后被拆散 为标量类型并间接地在栈上分配 &#xff09;。在经典分代的设计下&#xff0c;新生对象通常会分配在新生代中&#xff0c;少数 情况下&#xff0…

计数,桶与基数排序

目录 一. 计数排序 概念 步骤思路如下 实现代码如下 时间复杂度与空间复杂度 1. 时间复杂度 2. 空间复杂度 计数排序的特点 二. 桶排序 概念 步骤思路如下 实现代码如下 时间复杂度与空间复杂度 1. 时间复杂度 2. 空间复杂度 桶排序的特点 三. 基数排序 概念 步…

Java核心API——Collection类

Collection类简介 * java集合框架 * java.util.Collection接口&#xff0c;是所有集合的顶级接口&#xff0c;规定了集合所必须的功能 * <p> * 集合与数组一样&#xff0c;可以保存一组具有相同类型元素数据结构 * 并且提供了对于元素的维护操作(方法)。 * 集合有多种不…

千万罚单,稠州商业银行屡教不改?

撰稿|芋圆 来源|贝多财经 今年&#xff0c;浙江稠州商业银行&#xff08;以下简称“稠州商行”&#xff09;似乎进入了多事之秋&#xff0c;刚刚兼并两家经营不善的村镇银行就紧接着收到大额罚单。 该行在2023年的经营业绩不算难看。据2023年年报&#xff0c;稠州商行的业绩从…

PHP 调用 1688 详情 API 接口的实战攻略

在电商领域&#xff0c;获取准确和详细的商品信息对于业务的发展至关重要。1688 作为国内知名的批发采购平台&#xff0c;其详情 API 接口为开发者提供了丰富的数据资源。本文将为您详细介绍如何使用 PHP 调用 1688 详情 API 接口。 一、前期准备 注册 1688 开放平台账号&#…

L2TP(Client-initiated模式)over IPSEC远程拨号实验

一、实验目的及拓扑 实验目的&#xff1a;通过L2TP客户端与LNS服务端建立L2TP隧道并承载在IPSEC网络上。其中L2TPoverIPsec客户端采用windows软终端模式&#xff08;Cloud3&#xff09;&#xff0c;AR1上将内网LNS&#xff08;FW1&#xff09;服务器采用NAT方式向外网进行映射…

基于深度学习的水果识别系统

1. 引言 随着计算机视觉技术的快速发展&#xff0c;基于深度学习的水果识别系统在农业、超市等场景中具有广泛的应用前景。例如&#xff0c;在农业中&#xff0c;水果识别系统可以帮助农民自动分类和计数水果&#xff0c;从而提高效率并减少人工成本&#xff1b;在超市中&…