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

Flask 应用结构与模块化管理详细笔记

1. 代码结构优化:StructureA

最初的 Flask 项目结构适用于小型应用,但不适用于大型应用。为了改进代码结构,我们将 URL 管理应用拆分为多个模块。

1.1 StructureA 目录结构

StructureA
|-- .flaskenv
|-- app.py
|-- views.py
|-- templates|-- base.html|-- home.html|-- list.html
  • app.py 负责初始化 Flask 应用
  • views.py 负责定义视图函数
  • templates/ 存放 HTML 模板

1.2 视图文件(views.py)

from flask import render_template
from app import app@app.route("/")
def home():return render_template('home.html', name='Alan')@app.route("/mylist")
def my_list():lst = ['Car', 'House', 'TV']return render_template('list.html', lst=lst)
  • app 变量需要在 views.py 导入前初始化,否则会导致 app 未定义的错误。

1.3 基础模板(base.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>StructureA</title>
</head>
<body><div><a href="{{ url_for('home') }}">Home</a><a href="{{ url_for('my_list') }}">List</a></div>{% block body %}{% endblock %}
</body>
</html>
  • 使用 url_for() 生成导航链接,使代码更具可维护性。

1.4 主页模板(home.html)

{% extends "base.html" %}{% block body %}
<h1>Hello {{ name }}</h1>
{% endblock %}

1.5 列表页模板(list.html)

{% extends "base.html" %}{% block body %}
<h1>My List</h1>
<ul>{% for item in lst %}<li>{{ item }}</li>{% endfor %}
</ul>
{% endblock %}

1.6 应用入口(app.py)

from flask import Flask
from jinja2 import StrictUndefinedapp = Flask(__name__)
app.jinja_env.undefined = StrictUndefinedimport views
  • Flask app 需要在 views.py 之前初始化。
  • 这样组织代码会导致导入复杂化,并可能出现 循环导入 问题,因此需要更好的结构。

2. Python 模块与导入机制

Python 文件可以作为模块导入其他 Python 文件。模块是包含变量、函数或类定义的文件,每个模块都有自己的命名空间。

2.1 模块的导入方式

import x  # 导入模块 x,使用 x.y 访问其内部成员
from x import y, z  # 直接导入 y, z,不需要加 x.
  • 模块首次导入时,Python 会执行该文件中的所有语句,这可能导致意外的副作用。
  • 循环导入 是大型项目中的常见问题,例如:
    # a.py
    import b  # 这里导入了 b.py# b.py
    import a  # 这里导入了 a.py
    
    • Python 发现 a 还没有完全加载,会导致 b 不能正确导入 a 中的对象,从而引发错误。

3. 代码结构优化:StructureB

为了更好的管理项目,我们采用 包(Package) 来组织代码。

3.1 StructureB 目录结构

StructureB
|-- .flaskenv
|-- run.py
|-- app|-- __init__.py|-- views.py|-- templates|-- base.html|-- home.html|-- list.html
  • app/ 变成了一个 Python 包,其中包含 __init__.py 作为包的初始化文件。
  • run.py 作为应用的入口点。

3.2 应用入口(run.py)

from app import app
  • run.py 仅用于导入 app,然后 Flask 运行 app 作为应用实例。

3.3 应用初始化(init.py)

from flask import Flask
from jinja2 import StrictUndefinedapp = Flask(__name__)
app.jinja_env.undefined = StrictUndefinedfrom app import views
  • 这里的 app__init__.py 中定义,使得整个 app/ 目录成为一个包。
  • 好处
    • 允许在 app/ 目录中添加多个模块,而不会导致导入冲突。
    • 避免 app.py 直接执行时的循环导入问题。

4. Flask 中的静态文件与数据文件

4.1 静态文件(static/)

Flask 默认会寻找 static/ 目录来提供静态资源(如 CSS、JS、图片等)。

  • 访问静态文件:
    <img src="{{ url_for('static', filename='images/pic.jpg') }}">
    
  • url_for('static', filename='…') 使得路径动态生成,更易维护。

4.2 数据文件(data/)

Flask 没有 data/ 目录的特殊约定,但它通常用于存储不可通过 URL 访问的文件(如数据库、文本文件等)。

  • 推荐的访问方式:
    with app.open_resource('data/quotes.txt') as file:app.globals_quotes = [line.strip() for line in file]
    
  • 存入 Flask 全局对象
    app.globals_quotes = some_data
    

5. 总结

改进点StructureAStructureB
代码组织扁平结构,所有代码在 app.py采用包结构,app/ 作为 Flask 应用
视图管理直接在 app.py 中定义views.py 独立存放
启动方式python app.pypython run.py
代码可维护性易出现循环导入问题结构清晰,模块化管理

6. Flask 项目最佳实践

  1. 使用包结构 (app/ + __init__.py),避免循环导入问题。
  2. 将视图拆分为模块,避免 app.py 过大。
  3. 使用 static/ 存放静态文件,并通过 url_for() 生成链接。
  4. 使用 data/ 存放非 URL 访问的数据,并通过 app.open_resource() 读取。

相关文章:

Flask 应用结构与模块化管理详细笔记

1. 代码结构优化&#xff1a;StructureA 最初的 Flask 项目结构适用于小型应用&#xff0c;但不适用于大型应用。为了改进代码结构&#xff0c;我们将 URL 管理应用拆分为多个模块。 1.1 StructureA 目录结构 StructureA |-- .flaskenv |-- app.py |-- views.py |-- templat…...

Excel的两个小问题解决

&#xff08;一&#xff09;因为合并单元格存在&#xff0c;无法使用下拉自动填充公式。 解决方案&#xff1a; 使用 CtrlEnter 组合键 选中目标区域&#xff1a;选中需要应用公式的所有合并单元格区域&#xff0c;这些单元格可能是由 2 行或 3 行等合并而成。输入公式&…...

计算机毕业设计Python+DeepSeek-R1大模型期货价格预测分析 期货价格数据分析可视化预测系 统 量化交易大数据 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

JVM 面试

JVM 运行时内存区域划分是怎样的&#xff1f; 程序计数器&#xff1a;记录当前线程执行的字节码指令的地址&#xff0c;是线程私有的。 Java 虚拟机栈&#xff1a;每个方法在执行时都会创建一个栈帧&#xff0c;用于存储局部变量表、操作数栈、动态链接、方法出口等信息&#…...

智慧后勤的消防管理:豪越科技为安全护航

智慧后勤消防管理难题大揭秘&#xff01; 在智慧后勤发展得如火如荼的当下&#xff0c;消防管理却暗藏诸多难题。传统模式下&#xff0c;消防设施分布得那叫一个散&#xff0c;就像一盘散沙&#xff0c;管理起来超费劲。人工巡检不仅效率低&#xff0c;还容易遗漏&#xff0c;不…...

【Elasticsearch】(Java 版)

Elasticsearch&#xff08;Java 版&#xff09; 文章目录 Elasticsearch&#xff08;Java 版&#xff09;**1. Elasticsearch 简介****1.1 什么是 Elasticsearch&#xff1f;****1.2 核心概念** **2. 安装与配置****2.1 环境要求****2.2 安装步骤****Linux/macOS****Windows** …...

DeepSeek在昇腾上的模型部署 - 常见问题及解决方案

2024年12月26日&#xff0c;DeepSeek-V3横空出世&#xff0c;以其卓越性能备受瞩目。该模型发布即支持昇腾&#xff0c;用户可在昇腾硬件和MindIE推理引擎上实现高效推理&#xff0c;但在实际操作中&#xff0c;部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾Dee…...

安全面试5

文章目录 sql的二次注入在linux下&#xff0c;现在有一个拥有大量ip地址的txt文本文档&#xff0c;但是里面有很多重复的&#xff0c;如何快速去重&#xff1f;在内网渗透中&#xff0c;通过钓鱼邮件获取到主机权限&#xff0c;但是发现内网拦截了tcp的出网流量&#xff0c;聊一…...

【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)

本章将详细介绍四大主流金融数据源&#xff08;Tushare、AkShare、Baostock、通联数据&#xff08;DataAPI&#xff09;&#xff09;&#xff0c;分析其特点与适用场景&#xff0c;并通过实战案例展示数据获取与处理的全流程。 &#x1f449; 点击关注不迷路 &#x1f449; 点击…...

Exoplayer(MediaX)实现音频变调和变速播放

在K歌或录音类应用中变调是个常见需求&#xff0c;比如需要播出萝莉音/大叔音等。变速播放在影视播放类应用中普遍存在&#xff0c;在传统播放器Mediaplayer中这两个功能都比较难以实现&#xff0c;特别在低版本SDK中&#xff0c;而Exoplayer作为google官方推出的Mediaplayer替…...

服务器间迁移conda环境

注意&#xff1a;可使用迁移miniconda文件 or 迁移yaml文件两种方式&#xff0c;推荐前者&#xff0c;基本无bug&#xff01; 一、迁移miniconda文件&#xff1a; 拷贝旧机器的miniconda文件文件到新机器: 内网拷贝&#xff1a;scp -r mazhf192.168.1.233:~/miniconda3 ~/ 外…...

docker高级

文章目录 1.Docker Compose1.1 介绍1.2 compose文件1.3 常用命令1.4 安装1.5 项目说明和构建1.5.1 手工启动1.5.2 compose 编排启动1.5.3 完善 compose.yml1.5.4 加入前端容器 2.UI管理平台2.1 portainer 3.镜像发布3.1 阿里云3.2 Docker Registry3.2.1 介绍3.2.2 安装3.2.3 测…...

Redis Stream基本使用及应用场景

一、概念 Redis Streams是Redis5.0提供的一种消息队列机制&#xff0c;支持多播的可持久化的消息队列&#xff0c;用户实现发布订阅的功能&#xff0c;借鉴了kafka设计。 二、常用命令 命令名称描述XADD key ID field value [field value ...]添加一条消息 key&#xff1a;St…...

DAY40|动态规划Part08|LeetCode: 121. 买卖股票的最佳时机 、 122.买卖股票的最佳时机II 、 123.买卖股票的最佳时机III

目录 LeetCode:121. 买卖股票的最佳时机 暴力解法 贪心法 动态规划法 LeetCode:122.买卖股票的最佳时机II 基本思路 LeetCode: 买卖股票的最佳时机III、IV 基本思路 C代码 LeetCode:121. 买卖股票的最佳时机 力扣题目链接 文字讲解&#xff1a;121. 买卖股票的最佳时…...

【安装及调试旧版Chrome + 多版本环境测试全攻略】

&#x1f468;&#x1f4bb; 安装及调试旧版Chrome 多版本环境测试全攻略 &#x1f310; &#xff08;新手友好版 | 覆盖安装/运行/调试全流程&#xff09; &#x1f570;️ 【背景篇】为什么我们需要旧版浏览器测试&#xff1f; &#x1f30d; &#x1f310; 浏览器世界的“…...

【Linux】进程间通信——命名管道

文章目录 命名管道什么是命名管道**命名管道 vs. 无名管道**如何创建命名管道 用命名管道实现进程间通信MakefileComm.hppServer.hppClient.hppServer.cppClient.cpp 效果总结 命名管道 什么是命名管道 命名管道&#xff0c;也称为 FIFO&#xff08;First In First Out&#…...

Qt在Linux嵌入式开发过程中复杂界面滑动时卡顿掉帧问题分析及解决方案

Qt在Linux嵌入式设备开发过程中&#xff0c;由于配置较低&#xff0c;加上没有GPU&#xff0c;我们有时候会遇到有些组件比较多的复杂界面&#xff0c;在滑动时会出现掉帧或卡顿的问题。要讲明白这个问题还得从CPU和GPU的分工说起。 一、硬件层面核心问题根源剖析 CPU&#x…...

AI学习第六天-python的基础使用-趣味图形

在 Python 编程学习过程中&#xff0c;turtle库是一个非常有趣且实用的工具&#xff0c;它可以帮助我们轻松绘制各种图形。结合for循环、random模块以及自定义方法等知识点&#xff0c;能够创作出丰富多彩的图案。下面就来分享一下相关的学习笔记。 一、基础知识点回顾 &…...

[VMware]卸载VMware虚拟机和Linux系统ubuntu(自记录版)

记录一下,不是教程,只是防止我做错了可以回溯一下 我打开vscode,就会跳出下图 虚拟机,Linux还是很久之前学习安装的,种途可能卸载过(不太记得了),现在尝试彻底卸载 彻底卸载VMware虚拟机的详细步骤-CSDN博客虚拟机Vmware 转移 克隆 卸载及移除Linux系统_克隆的虚拟机怎么移除-…...

J-LangChain,用Java实现LangChain编排!轻松加载PDF、切分文档、向量化存储,再到智能问答

Java如何玩转大模型编排、RAG、Agent&#xff1f;&#xff1f;&#xff1f; 在自然语言处理&#xff08;NLP&#xff09;的浪潮中&#xff0c;LangChain作为一种强大的模型编排框架&#xff0c;已经在Python社区中广受欢迎。然而&#xff0c;对于Java开发者来说&#xff0c;能…...

3分钟免费搞定专业条码!Libre Barcode字体终极指南

3分钟免费搞定专业条码&#xff01;Libre Barcode字体终极指南 【免费下载链接】librebarcode Libre Barcode: barcode fonts for various barcode standards. 项目地址: https://gitcode.com/gh_mirrors/li/librebarcode 还在为复杂的条码生成工具而烦恼吗&#xff1f;…...

Blazor组件生态生死线,2026年淘汰清单曝光:17个高危NuGet包+5个即将废弃API(含迁移路径图谱)

第一章&#xff1a;Blazor组件生态生死线&#xff1a;2026年淘汰预警全景图Blazor 组件生态正站在结构性分化的临界点。微软官方已明确将 .NET 8 的长期支持&#xff08;LTS&#xff09;周期定为至 2026 年 11 月&#xff0c;而所有基于 .NET 6/7 构建的第三方组件库若未完成向…...

第2篇 | 分层架构的真相:为什么AUTOSAR不是“标准答案”,而是“解题框架”?

初学者常问&#xff1a;“AUTOSAR的分层架构是不是最优的&#xff1f;”这个问题的陷阱在于——它把架构当成了答案&#xff0c;而不是解题的框架。 分层解耦的代价&#xff1a;一个性能开销的真实案例 某动力总成项目中&#xff0c;工程师需要在两个SWC之间传递一个32字节的扭…...

力扣热门100题之二叉树的最近公共祖先

一句话核心思路递归遍历二叉树&#xff1a;如果当前节点是 p 或 q&#xff0c;直接返回它去左子树找&#xff0c;去右子树找如果左右都找到了 → 当前节点就是答案如果只在左边找到 → 答案在左边如果只在右边找到 → 答案在右边完整代码实现&#xff1a;/*** Definition for a…...

Andrej Karpathy四大AI编程原则:远程团队协作效率提升指南 [特殊字符]

Andrej Karpathy四大AI编程原则&#xff1a;远程团队协作效率提升指南 &#x1f680; 【免费下载链接】andrej-karpathy-skills 项目地址: https://gitcode.com/GitHub_Trending/an/andrej-karpathy-skills 在当今分布式工作时代&#xff0c;远程团队协作已成为软件开发…...

高效卸载Microsoft Edge:解决浏览器残留问题的PowerShell工具

高效卸载Microsoft Edge&#xff1a;解决浏览器残留问题的PowerShell工具 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover …...

3步打造企业级WiFi热点:Windows用户的开源网络共享解决方案

3步打造企业级WiFi热点&#xff1a;Windows用户的开源网络共享解决方案 【免费下载链接】VirtualRouter Wifi Hotspot for Windows computers (Windows 7, 8.x, Server 2012 and newer!) 项目地址: https://gitcode.com/gh_mirrors/vi/VirtualRouter 你是否遇到过会议室…...

前端新手天天踩坑?安全老兵带你彻底搞懂HTML“路径引用”与“跳转陷阱”(附实战代码)

我平时在做代码审计和渗透测试时,经常会碰到一类让人哭笑不得的低级Bug:本地测试好好的图片,一部署到服务器上就全部裂开;别人点击网页上的链接,直接报404找不到页面。 这些问题归根结底,都是因为新手没有彻底搞懂 HTML 的**路径(Path)和锚点(Anchor)**规则。很多同…...

中兴光猫工厂模式终极开启指南:zteOnu工具完整使用教程

中兴光猫工厂模式终极开启指南&#xff1a;zteOnu工具完整使用教程 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 你是否遇到过想要调整中兴光猫的高级设置&#xff0c;却发现普通用户…...

把 Predefined Field Enabling 接进 RAP 业务对象里,给你的 SaaS 应用留出真正可控的客户扩展位

很多做 ABAP Cloud 的同学,做到 RAP 业务对象这一层时,会把可扩展性理解成两条路,一条是开发者自己预留字段,一条是交给 Key User 在运行期做字段配置。真正有意思的地方,其实在两条路的交汇点上,开发者先把边界、元数据、校验规则和发布契约搭好,客户再在自己的租户里把…...