当前位置: 首页 > news >正文

慕慕手记项目日志 项目从开发到部署多环境配置 2025-3-8

慕慕手记项目日志 项目从开发到部署多环境配置 2025-3-8

现在是已经到了课程的第十章了,开始进行配置项目环境了。现在要完成的任务是项目可以正常运行,而且可以自由切换配置,开发/测试。

下面是当前的目录结构图:

在这里插入图片描述

现在来解释一下这些目录的作用:

  1. app:这是项目的主目录,包含了整个应用的核心代码。

    • config

      :配置文件夹,包含项目的配置信息。

      • *init*.py:初始化文件,使这个目录成为一个包。
      • config.py:配置文件,可能包含数据库连接信息、环境变量等。
      • settings.py:设置文件,可能包含一些全局设置。
    • common

      :通用模块,可能包含一些公共函数或类。

      • *init*.py:初始化文件。
      • database.py:数据库相关的操作,如ORM模型定义。
    • controller

      :控制器模块,处理HTTP请求并返回响应。

      • *init*.py:初始化文件。
      • user.py:用户相关的控制器,处理与用户相关的请求。
    • model

      :模型模块,定义数据模型。

      • *init*.py:初始化文件。
      • user.py:用户模型,定义用户相关的数据结构。

其中的config软件包下面的config.py文件里面定义了,配置的区别根据不同的情况返回对应的配置

class Config:db_url = "mysql+pymysql://root:123456@172.27.13.88:3306/mumushouji"class TestConfig(Config):if_Echo = Trueclass ProductionConfig(Config):if_Echo = False# 根据环境变量选择不同的配置
config = {"test": TestConfig,"prod": ProductionConfig
}

然后settings.py文件内需要传入env变量的类型如以下就是使用的测试环境配置

env="test"

app.py文件内定义了两个函数,分别是注册蓝图和返回app对象

from flask import Flask
def create_app():app = Flask(__name__,template_folder="../templates",static_url_path="/",static_folder="../resource")init_Blueprint(app) # 注册蓝本return appdef init_Blueprint(app):from controller.user import userapp.register_blueprint(user)

common软件包下的database.py文件内包含了数据库对象初始化的一些代码,和使用的环境

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
from app.settings import env
from app.config.config import config
# \app\database.py
def db_connect():config_class = config[env]()engine = create_engine( config_class.db_url, echo=config_class.if_Echo)session = sessionmaker(engine)# 保证线程安全db_session = scoped_session(session)Base = declarative_base() # 创建一个基类return db_session, Base, engine

接下来是控制器和模型类,这里定义了蓝图对象

from flask import Blueprintfrom model.user import Useruser = Blueprint('user', __name__)
@user.route('/')
def get_one():user = User()result = user.get_one()print(result)return "ok"

模型类里面暂时定义了User表的数据库对象还有db_sessionengine以及基类Base,但是我们这里用到的这三个对象都需要从db_connect函数内返回

from sqlalchemy import Tablefrom common.database import db_connect # 导入db_connect函数db_session, Base, engine = db_connect()
# 定义表结构
class User(Base):__table__ = Table('user', Base.metadata,autoload_with=engine)def get_one(self):return db_session.query(User).first()

日志的基本配置与应用

在该项目中,我们使用这样的日志配置。日志等级会随着env参数的改变而改变

import logging
from logging.handlers import RotatingFileHandlerfrom app.config.config import config
from app.settings import env
def set_log():config_class = config[env]()logging.basicConfig(level=config_class.LOG_LEVEL,)file_log_handler = RotatingFileHandler("log/mumunote.log", maxBytes=1024 * 1024 * 300, backupCount=10)#添加全局日志记录器formater = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')file_log_handler.setFormatter(formater)logging.getLogger().addHandler(file_log_handler)set_log()
  • config_class = config[env](): 根据当前环境获取对应的配置类实例。
  • logging.basicConfig(level=config_class.LOG_LEVEL,): 设置全局日志级别。这将影响所有未明确设置级别的日志记录器。
  • file_log_handler = RotatingFileHandler(...): 创建一个RotatingFileHandler实例,指定日志文件名、单个日志文件的最大大小(这里是300MB),以及保留旧日志文件的最大数量(这里是10个)。
  • formater = logging.Formatter(...): 定义日志输出格式,包括时间戳、源文件名、行号、日志级别和消息内容。
  • file_log_handler.setFormatter(formater): 将上面定义的格式应用于RotatingFileHandler实例。
  • logging.getLogger().addHandler(file_log_handler): 将file_log_handler添加到根日志记录器中,这意味着所有的日志记录都会通过这个处理器输出到日志文件中,并遵循上述设定的规则

刚刚出现的一些问题

由于视频里面的那些源文件我没有,我只能从已有的项目代码里面拷过来一部分前端的代码进行使用。但是刚刚报错误了,提示少了东西

  File "D:\code\mumunote\templates\index.html", line 1, in top-level template code{% extends 'public/header.html' %}^^^^^^^^^^^^^^^^^^^^^^^^^File "D:\code\mumunote\templates\public\header.html", line 135, in top-level template code{% block content %}File "D:\code\mumunote\templates\index.html", line 7, in block 'content'{% for label_name,label_value in label_types.items() %}

就是这个错误。根据通义千问给我的反馈,我定义了些变量,然后前端就能正常加载了。

 label_types = {'type1': 'value1','type2': 'value2',# 根据实际情况添加更多键值对...}

当前状态:

在这里插入图片描述

附完整代码:

controllter/index.py

from flask import Blueprint, render_templateindex = Blueprint('index',__name__)
@index.route('/')
def home():label_types = {'type1': 'value1','type2': 'value2',# 根据实际情况添加更多键值对...}return render_template("index.html",label_types=label_types)

当前目录结构:

在这里插入图片描述

首页数据的填充 (1)

首页数据的填充,需要在在controller模块下面创建index.py,再实现home类中的find_article函数

from flask import Blueprint, render_template, requestfrom model.article import Articleindex = Blueprint('index',__name__)
@index.route('/')
def home():page = request.args.get("page")article_type = request.args.get("article_type")if page is None:page = 1if article_type is None:article_type = 'recommend'article = Article()db_result = article.find_article(page,article_type)label_types = {'type1': 'value1','type2': 'value2',# 根据实际情况添加更多键值对...}return render_template("index.html",label_types=label_types,result=db_result)

其中有一个很大的问题是没有label_types参数,页面就会503,暂时没有排查出来是哪里的问题,我们再来看模型类中的的Article类是怎么写的

from itertools import countfrom sqlalchemy import Tablefrom common.database import db_connect
from app.settings import env
from app.config.config import config
from model.user import User
# model/article.py
db_session, Base, engine = db_connect()
# 定义表结构
class Article(Base):__table__ = Table('article', Base.metadata,autoload_with=engine)def find_article(self, page, article_type="recommend"):#     一页显示多少内容呢,我们默认为一个10,page默认应该是从1开始if int(page) < 1:page = 1count = int(page) * config[env].page_count# 这就证明是来到了推荐的分类下边if article_type == "recommend":result = db_session.query(Article, User.nickname).join(User, User.user_id == Article.user_id).filter(Article.drafted == 1).order_by(Article.browse_num.desc()).limit(count).all()else:result = db_session.query(Article, User.nickname).join(User, User.user_id == Article.user_id).filter(Article.label_name == article_type,Article.drafted == 1).order_by(Article.browse_num.desc()).limit(count).all()return result
  1. 表结构定义:

    __table__ = Table('article', Base.metadata, autoload_with=engine)
    

    这行代码使用已有的数据库表 'article' 来动态加载表结构,而不是通过类属性来手动定义每个字段。autoload_with=engine 参数告诉 SQLAlchemy 使用提供的数据库连接(engine)来反射表结构。

  2. 分页与查询逻辑:

    • 方法 find_article(self, page, article_type="recommend") 被设计用来根据页面和文章类型检索文章。
    • page 参数表示当前请求的页数,默认从 1 开始。如果传入的 page 小于 1,则将其设置为 1。
    • count = int(page) * config[env].page_count 计算要获取的文章数量。这里假设在配置文件中已经定义了每页显示的文章数量 page_count
  3. 推荐文章查询:

    • 如果 article_type"recommend",则会执行特定的查询来获取被标记为推荐的文章。这些文章还需要满足 drafted == 1 的条件,这可能意味着它们是已发布的文章而不是草稿。
    • 查询语句通过 db_session.query(Article, User.nickname).join(...) 实现,其中包含了与 User 表的联结,以同时获取文章作者的昵称。
    • .filter(Article.drafted == 1) 添加过滤条件,确保只选择已发布的文章。
    • .order_by(Article.browse_num.desc()) 根据浏览次数对结果进行降序排序。
    • .limit(count).all() 限制返回的结果数量并获取所有匹配项。
  4. 按标签查询:

    • 如果 article_type 不是 "recommend",则根据提供的 article_type(即标签名)来筛选文章。查询逻辑与上述类似,但添加了额外的过滤条件 Article.label_name == article_type 来筛选特定标签的文章。

相关文章:

慕慕手记项目日志 项目从开发到部署多环境配置 2025-3-8

慕慕手记项目日志 项目从开发到部署多环境配置 2025-3-8 现在是已经到了课程的第十章了&#xff0c;开始进行配置项目环境了。现在要完成的任务是项目可以正常运行&#xff0c;而且可以自由切换配置&#xff0c;开发/测试。 下面是当前的目录结构图&#xff1a; 现在来解释一…...

华为配置篇-OSPF基础实验

OSPF 一、简述二、常用命令总结三、实验3.1 OSPF单区域3.2 OSPF多区域3.3 OSPF 的邻接关系和 LSA 置底 一、简述 OSPF&#xff08;开放式最短路径优先协议&#xff09; 基本定义 全称&#xff1a;Open Shortest Path First 类型&#xff1a;链路状态路由协议&#xff08;IGP&…...

闭包:JavaScript 中的隐形大杀器

你可能已经在很多地方听说过闭包这个词&#xff0c;尤其是涉及到 JavaScript 的作用域和异步操作时。闭包是 JavaScript 中非常核心的概念&#xff0c;然而它又非常容易让开发者感到困惑。今天我们就来深入剖析闭包&#xff0c;帮助你真正理解它的工作原理&#xff0c;以及如何…...

【消息队列】数据库的数据管理

1. 数据库的选择 对于当前实现消息队列这样的一个中间件来说&#xff0c;具体要使用哪个数据库&#xff0c;是需要稍作考虑的&#xff0c;如果直接使用 MySQL 数据库也是能实现正常的功能&#xff0c;但是 MySQL 也是一个客户端服务器程序&#xff0c;也就意味着如果想在其他服…...

玩转ChatGPT:GPT 深入研究功能

一、写在前面 民间总结&#xff1a; 理科看Claude 3.7 Sonnet 文科看DeepSeek-R1 那么&#xff0c;ChatGPT呢&#xff1f; 看Deep Research&#xff08;深入研究&#xff09;功能。 对于科研狗来说&#xff0c;在这个文章爆炸的时代&#xff0c;如何利用AI准确、高效地收…...

Centos8部署mongodb报错记录

使用mongo ops安装mongodb6.0.4副本集报错 error while loading shared libraries: libnetsnmpmibs.so.35: cannot open shared object file: No such file or directory 解决 yum install net-snmp net-snmp-devel -y建议&#xff1a;初始化系统时把官网上的依赖包都装一遍 即…...

2024四川大学计算机考研复试上机真题

2024四川大学计算机考研复试上机真题 2024四川大学计算机考研复试机试真题 历年四川大学计算机考研复试机试真题 在线评测&#xff1a;https://app2098.acapp.acwing.com.cn/ 分数求和 题目描述 有一分数序列&#xff1a; 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前 …...

前端面试题 口语化复述解答(从2025.3.8 开始频繁更新中)

背景 看了很多面试题及其答案。但是过于标准化&#xff0c;一般不能直接用于回复面试官&#xff0c;这里我将总结一系列面试题&#xff0c;用于自我复习也乐于分享给大家&#xff0c;欢迎大家提供建议&#xff0c;我必不断完善之。 Javascript ES6 1. var let const 的区别…...

更多文章请查看

更多文章知识请移步至下面链接&#xff0c;期待你的关注 如需查看新文章&#xff0c;请前往&#xff1a; 博主知识库https://www.yuque.com/xinzaigeek...

vulnhub靶场之【digitalworld.local系列】的vengeance靶机

前言 靶机&#xff1a;digitalworld.local-vengeance&#xff0c;IP地址为192.168.10.10 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.6 kali采用VMware虚拟机&#xff0c;靶机选择使用VMware打开文件&#xff0c;都选择桥接网络 这里官方给的有两种方式&#xff…...

MySql的安装及数据库的基本操作命令

1.MySQL的安装 1.1进入MySQL官方网站 1.2点击下载 1.3下拉选择MySQL社区版 1.4选择你需要下载的版本及其安装的系统和下载方式 直接安装以及压缩包 建议选择8.4.4LST LST表明此版本为长期支持版 新手建议选择红框勾选的安装方式 1.5 安装包下载完毕之后点击安装 2.数据库…...

中性点直接接地电网接地故障Simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2017Ra&#xff09;软件。建议采用matlab2017 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09; 2.系统仿真图&#xff1a; 3.中性点直接接地电网接地故障基本概念&#xff08;本仿…...

Linux16-数据库、HTML

数据库&#xff1a; 数据存储&#xff1a; 变量、数组、链表-------------》内存 &#xff1a;程序运行结束、掉电数据丢失 文件 &#xff1a; 外存&#xff1a;程序运行结束、掉电数据不丢失 数据库&#xff1a; …...

SpireCV荣获Gitee 最有价值开源项目称号

什么是GVP&#xff1f; GVP全称Gitee Valuable Project&#xff0c;意思为Gitee最有价值开源项目。作为GVP称号的获得者&#xff0c;SpireCV在开源社区中展现出了卓越的实力和影响力&#xff0c;为开源软件的发展和推广做出了积极的贡献。 这一荣誉不仅充分肯定了过去阿木实验…...

open-webui+deepseek api实现deepseek自由

虽然deepseek是免费的&#xff0c;但是官网的体验感太差。 所以才会有某种想法&#xff0c;想要更加舒服的使用deepseek。 1.Python虚拟环境 这个我就不多赘述&#xff0c;切记Python版本一定要和open-webui制定的版本一致。 2.deepseek api 去这个网站充点钱&#xff08;…...

Hadoop八股

Hadoop八股 HadoopMapReduce考点MR on Yarn 分布式工作原理shuffle&#xff1a;MapTask 和 ReduceTask的处理流程MR中的MapTask 和 ReduceTask 的数量决定MR和Spark两者Shuffle的区别简单讲一下map- reduce 原理**MapReduce 的核心概念****MapReduce 的工作流程****MapReduce 的…...

.NET Core全屏截图,C#全屏截图

.NET Core全屏截图&#xff0c;C#全屏截图 使用框架&#xff1a; WPF.NET 8 using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Threading.Tasks; using System.W…...

ajax之生成一个ajax的demo示例

目录 一. node.js和express ​二. 使用express创建后端服务 三. 创建前端 一. node.js和express ajax是前端在不刷新的情况下访问后端的技术&#xff0c;所以首先需要配置一个后端服务&#xff0c;可以使用node.js和express。 首先生成一个空项目&#xff0c;新建main目录…...

软件工程笔记下

从程序到软件☆ 章节 知识点 概论☆ 软件的定义&#xff0c;特点&#xff0c;生存周期。软件工程的概论。软件危机。 1.☆软件&#xff1a;软件程序数据文档 &#xff08;1&#xff09;软件&#xff1a;是指在计算机系统的支持下&#xff0c;能够完成特定功能与性能的包括…...

【自学笔记】Numpy基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Numpy基础知识点总览目录1. 简介Numpy是什么为什么使用Numpy 2. 数组对象&#xff08;ndarray&#xff09;创建数组数组的属性数组的形状操作 3. 数组的基本操作数组…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...