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

前言

在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应用和数据库连接池,提高代码的可维护性和可测试性。

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
日志管理

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

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
接口响应统一格式

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

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})
接口层

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

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定义数据模型,进行参数验证和序列化。

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}>'
服务层

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

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("添加项目失败")
数据模型

定义数据库模型。

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())
数据层

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

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.xdnf.cn/news/1547850.html

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

相关文章

前端基础面试题·第四篇——Vue(其一)

1.v-if 和 v-show的区别 在Vue中这两个命令都用于控制元素的显示与隐藏。 (1) v-if 动态控制元素显示与隐藏&#xff0c;本质上是动态销毁或者重建元素&#xff0c;会触发浏览器重排与重绘。在切换状态时有一个局部编译/卸载的过程会适当重建或者销毁内部的事件监听、子组件。…

数据结构与算法实验9 实现无向连通图的最小生成树

文章目录 1.上机名称2.上机要求3.上机环境4.程序清单(写明运行结果及结果分析)4.1 程序清单4.1.1 头文件 Graph.h 内容如下&#xff1a;4.1.2 实现文件 Graph.cpp 内容如下&#xff1a;4.1.3 源文件 main.cpp 内容如下&#xff1a; 4.2 运行结果 5.上机体会 1.上机名称 实现无向…

如何使用Git管理项目工程

目录 安装git 注册gitee gitee注册示例 git账户配置 使用git仓库 在本地生成一个git仓库 创建文件并增加commit 命令详解 git status git add git commit git remote git push git pull git fetch git log git branch 安装git windows下安装git可以直接上git…

distinct导致sql超时

前言 昨天敲着敲着代码&#xff0c;小杨哥跑过来给我说&#xff0c;快看他们大会议室演示报错了&#xff0c;还是一堆错了。完了啊在演示的时候报错&#xff01;&#xff01;&#xff01;接下来我们分析一下是什么原因吧。 问题分析 查看日志&#xff1a; 从日志打印看明显的…

Gin框架简易搭建(3)--Grom与数据库

写在前面 项目地址 个人认为GORM 指南这个网站是相比较之下最为清晰的框架介绍 但是它在环境搭建阶段对于初学者而言不是很友好&#xff0c;尤其是使用mysql指令稍有不同&#xff0c;以及更新的方法和依赖问题都是很让人头疼的&#xff0c;而且这些报错并非逻辑上的&#xf…

用大模型优化大模型预训练数据,节省20倍计算量,实现显著性能提升!

生成式人工智能研究实验室&#xff08;GAIR&#xff0c;主页&#xff1a;https://plms.ai/&#xff09;是国内首个聚焦于生成式人工智能的高校研究组。汇聚了来自于 CMU、复旦、交大&#xff08;ACM 班、IEEE 试点班等&#xff09;等顶尖高校的年轻本硕博人才。实验室专注于三大…

大数据-150 Apache Druid 安装部署 单机启动 系统架构

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

从‘盲管’到‘智网’,漫途精准构建排水管网监测方案

在城市错综复杂的基础设施网络中&#xff0c;排水管网作为城市的“血脉”&#xff0c;其高效、稳定运行直接关系到城市生活的安宁与财产的安全。面对日益频繁的雨季挑战与气候变化的不确定性&#xff0c;传统“盲管”管理模式已难以满足现代城市治理的需求。 漫途排水管网监测…

LED显示屏如何通过FMEA进行风险分析:打造无忧显示新境界

LED显示屏作为高科技产品&#xff0c;其性能受到多种因素的影响&#xff0c;包括但不限于设计缺陷、材料质量、制造工艺、使用环境等。任何环节的疏漏都可能导致显示屏出现亮度不均、色彩失真、故障频发等问题&#xff0c;进而影响用户体验和品牌形象。因此&#xff0c;通过FME…

Linux标准IO(四)-格式化I/O输入

C 库函数提供了 3 个格式化输入函数&#xff0c;包括&#xff1a;scanf()、fscanf()、sscanf()&#xff0c;其函数定义如下所示&#xff1a; #include <stdio.h> int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(c…

Spring Web MVC课后作业

目录 1.加法计算器 2.⽤户登录 3.留⾔板 1.加法计算器 &#xff08;1&#xff09;需求分析 加法计算器功能, 对两个整数进⾏相加, 需要客⼾端提供参与计算的两个数, 服务端返回这两个整数计算 的结果。 &#xff08;2&#xff09;接⼝定义 请求路径&#xff1a; calc/sum 请…

爬取元气手机壁纸简单案例(仅用于教学,禁止任何非法获利)

爬虫常用的库 爬虫&#xff08;Web Scraping&#xff09;是一种从网页上提取数据的技术。在 Python 中&#xff0c;有许多库可以帮助实现这一目标。以下是一些常用的爬虫库&#xff0c;以及对 BeautifulSoup 的详细介绍。 常用爬虫库 1.Requests ​ a.功能&#xff1a;用于发…

spark计算引擎-架构和应用

一Spark 定义&#xff1a;Spark 是一个开源的分布式计算系统&#xff0c;它提供了一个快速且通用的集群计算平台。Spark 被设计用来处理大规模数据集&#xff0c;并且支持多种数据处理任务&#xff0c;包括批处理、交互式查询、机器学习、图形处理和流处理。 核心架构&#x…

ChatGPT Sidebar 浏览器插件配置指南

随着聊天机器人技术的不断进步&#xff0c;越来越多的人开始依赖这些强大的工具来提高工作效率、获取信息和解决问题。OpenAI 的 ChatGPT 是其中最受欢迎的聊天机器人之一。为了方便用户在浏览网页时随时与 ChatGPT 互动&#xff0c;开发者们设计了一款名为 ChatGPT Sidebar 的…

Latex——一行的划线 如何分开

代码&#xff1a; \cmidrule(r){3-4} \cmidrule(r){5-6} \cmidrule(r){7-8}效果&#xff1a; 参考文章&#xff1a; LaTeX技巧653&#xff1a;如何隔开LaTeX表格邻近\cline表格线&#xff1f;

四,MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)

四&#xff0c;MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用) 文章目录 四&#xff0c;MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)1. 主键策略1.1 主键生成策略介绍 2. 准备工作&#xff1a;2.1 AUTO 策略2.2 INPUT 策略2.3 ASSIGN_ID 策略2.3.1 雪花算…

电动车、电单车入梯数据集电动车进电梯检测识别(代码+教程+数据集)

数据集介绍 共有 5347 张图像和一一对应的标注文件 标注文件格式提供了两种&#xff0c;包括VOC格式的xml文件和YOLO格式的txt文件。 标注的对象共有以下几种&#xff1a; [‘Electric-bicycle’] 标注框的数量信息如下&#xff1a;&#xff08;标注时一般是用英文标的&am…

AC-DC电源自动测试系统介绍

AC-DC电源模块测试系统是一种高度自动化的测试设备&#xff0c;能够模拟实际工作环境中的交流电输入&#xff0c;并测量电源模块的输出电压、电流、功率等关键参数&#xff0c;以及评估其电磁兼容性、效率、热特性等性能指标。 AC-DC电源模块测试系统的主要硬件组成包括&#…

TDEngine在煤矿综采管控平台中的应用

一、行业背景 智能综采管控平台&#xff0c;是将煤矿综采工作面传感器数据采集&#xff0c;通过可视化界面展示。实现综采工作面的透明化展示&#xff0c;并基于历史的传感器数据进行机器学习的训练&#xff0c;了解工作面周期来压&#xff0c;设备故障检测等数据应用。因此针…

纷享销客生态伙伴大会西安站圆满落幕,共话CRM新纪元

9月19日&#xff0c;以“智享未来&#xff0c;领创CRM新纪元”为主题的纷享销客生态伙伴大会在西安成功举办。本次会议汇聚了SaaS领域、软件行业以及TOB市场的杰出代表、行业领袖以及技术前沿专家&#xff0c;共同探讨SaaS CRM行业的当前发展趋势&#xff0c;并就AI在CRM领域的…