项目实战:构建高效可扩展的Flask Web框架:集成Flask-SQLAlchemy、Marshmallow与日志管理

server/2024/12/22 14:11:35/
前言

在Web开发中,构建一个既高效又可扩展的框架是项目成功的基石。Flask作为一个轻量级的Web应用框架,凭借其易用性和灵活性,特别适合快速开发和原型设计。结合Flask-SQLAlchemy(为Flask提供SQLAlchemy ORM支持的扩展)和Marshmallow(强大的Python对象序列化/反序列化库),我们能够创建出一个既能高效处理数据库操作又能优雅地转换数据为JSON格式的Web框架。

环境准备

确保MySQL数据库已部署并创建好相应数据库。接着,使用pip安装所需依赖:

pip install Flask Flask-SQLAlchemy marshmallow pymysql
  • Flask:用于实现Web应用的接口层。
  • Flask-SQLAlchemy:简化在Flask应用中使用SQLAlchemy ORM的操作,处理数据层。
  • PyMysql:作为SQLAlchemy的数据库驱动。
  • Marshmallow:用于数据的序列化和反序列化,以及数据验证。
App工厂模式

采用app工厂模式来创建Flask应用和数据库连接池,提高代码的可维护性和可测试性。

python">from flask import Flask  
from flask_sqlalchemy import SQLAlchemy  db = SQLAlchemy()  def create_app():  app = Flask(__name__)  # 配置数据库  app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://user:password@127.0.0.1:3306/db'  app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 减少开销  # 初始化数据库  db.init_app(app)  with app.app_context():  db.create_all()  return app
日志管理

实现一个日志管理器,用于项目中的日志记录和保存。

python">import logging  
from logging.handlers import RotatingFileHandler  def setup_logging(name, log_level=logging.DEBUG, max_bytes=5*1024*1024, backup_count=5):  """  配置日志系统。  """  logger = logging.getLogger(name)  logger.setLevel(log_level)  # 日志文件处理器  file_handler = RotatingFileHandler('app.log', maxBytes=max_bytes, backupCount=backup_count)  file_handler.setLevel(log_level)  # 控制台处理器  console_handler = logging.StreamHandler()  console_handler.setLevel(log_level)  # 设置日志格式  formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  file_handler.setFormatter(formatter)  console_handler.setFormatter(formatter)  # 添加处理器到logger  logger.addHandler(file_handler)  logger.addHandler(console_handler)  return logger
接口响应统一格式

创建一个工具类来统一接口响应格式。

python">from flask import jsonify  class Response:  @staticmethod  def success(data=None, msg="成功"):  return jsonify({'data': data, 'msg': msg, 'code': 200})  @staticmethod  def error(msg="错误"):  return jsonify({'msg': msg, 'code': 500})
接口层

定义接口路由和处理函数。

python">from flask import request  
from config.app_factory import create_app, db  
from service.project_service import ProjectService  app = create_app()  @app.route('/addProject', methods=['POST'])  
def add_project():  project_service = ProjectService()  return project_service.add_project(request.json)  if __name__ == '__main__':  app.run(port=8081)
数据验证与序列化

使用Marshmallow定义数据模型,进行参数验证和序列化。

python">from marshmallow import Schema, fields, ValidationError  class ProjectSchema(Schema):  id = fields.Int(dump_only=True)  name = fields.Str(required=True, validate=lambda x: len(x) >= 1)  create_time = fields.DateTime(dump_only=True)  update_time = fields.DateTime(dump_only=True)  def __repr__(self):return f'<User {self.name}>'
服务层

服务层负责业务逻辑处理。

python">from service.project_service import ProjectService  
from config.res_bean import Response  
from mapper.project_mapper import ProjectMapper  
import config.log as logger  class ProjectService:  def __init__(self):  self.log = logger.setup_logging(self.__class__.__name__)  def add_project(self, json_data):  project_schema = ProjectSchema()  try:  data = project_schema.load(json_data)  return ProjectMapper.add_project(data)  except ValidationError as err:  self.log.error('参数错误:', err)  return Response.error(str(err))  except Exception as e:  self.log.error('添加项目失败:', e)  return Response.error("添加项目失败")
数据模型

定义数据库模型。

python">from config.app_factory import db  class Project(db.Model):  __tablename__ = 'project'  id = db.Column(db.Integer, primary_key=True)  name = db.Column(db.String(80), nullable=False)  create_time = db.Column(db.DateTime, default=db.func.now())  update_time = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now())
数据层

实现数据库操作的具体逻辑。

python">from datetime import datetime  
from module.project import Project  
from config.res_bean import Response  
import config.log as logger  class ProjectMapper:  @staticmethod  def add_project(data):  try:  new_project = Project(name=data['name'], create_time=datetime.now(), update_time=datetime.now())  db.session.add(new_project)  db.session.commit()  logger.setup_logging(ProjectMapper.__name__).info('添加项目成功')  return Response.success(msg="添加项目成功")  except Exception as e:  db.session.rollback()  logger.setup_logging(ProjectMapper.__name__).error('添加项目失败:', e)  return Response.error("添加项目失败")
运行结果

完成以上步骤后,运行应用并调用示例接口进行验证。
在这里插入图片描述


http://www.ppmy.cn/server/126538.html

相关文章

Android SystemUI组件(09)唤醒亮屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 唤醒亮屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来…

区块链可投会议CCF C--FC 2025 截止10.8 附录用率

Conference&#xff1a;Financial Cryptography and Data Security (FC) CCF level&#xff1a;CCF C Categories&#xff1a;network and information security Year&#xff1a;2025 Conference time&#xff1a;14–18 April 2025, Miyakojima, Japan 录用率&#xff1…

npm切换到淘宝镜像

1、输入以下命令后回车&#xff0c;npm切换至淘宝镜像 npm config set registry https://registry.npmmirror.com 2、输入以下命令后回车&#xff0c;检查是否切换成功 npm config get registry 若返回此信息&#xff0c;表示切换成功 3、切换后就可使用淘宝镜像加快npm包的…

GPT对话知识库——bootloader是什么?ymodel协议是什么?

目录 1&#xff0c;问&#xff1a; 1&#xff0c;答&#xff1a; Bootloader 的主要功能 Bootloader 的工作流程 Bootloader 的应用场景 典型 Bootloader 实现的例子 1. STM32 的 Bootloader 2. U-Boot (Universal Bootloader) 总结 2&#xff0c;问&#xff1a; 2&…

c语言基础作业

选择题 1.1、以下选项中,不能作为合法常量的是 __________ A&#xff09;1.234e04 B&#xff09;1.234e0.4C&#xff09;1.234e4 D&#xff09;1.234e0 1.2、以下定义变量并初始化错误的是_____________。 A) char c1 ‘H’ &#xff1b; B) char c1 9…

从AR眼镜到智能巡检:XR技术的演变与未来潜力

XR&#xff0c;即扩展现实&#xff08;Extended Reality&#xff09;&#xff0c;是一个涵盖了增强现实&#xff08;AR&#xff09;、虚拟现实&#xff08;VR&#xff09;和混合现实&#xff08;MR&#xff09;的广泛概念。 从我们最初接触到的手机应用到Hololens&#xff0c;…

一文了解构建工具——Maven与Gradle的区别

目录 一、Maven和Gradle是什么&#xff1f; 构建工具介绍 Maven介绍 Gradle介绍 二、使用时的区别&#xff1a; 1、新建项目 Maven&#xff1a; Gradle&#xff1a; 2、配置项目 Maven&#xff1a; Gradle&#xff1a; 3、构建项目——生成项目的jar包 Gradle&…

试用Foxit PDF: 在网页中单页展示PDF

产品需求 在网页中展示PDF文件&#xff0c;每次展示一页&#xff0c;通过按钮进行翻页。 思路分析 之前网站功能分别使用vue-pdf和pdfjs-dist实现过&#xff0c;但渲染速度都特别慢&#xff0c;所以想试试foxit pdf插件。网站只是用插件单页展示PDF文件&#xff0c;功能简单&a…