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中的对象,从而引发错误。
- Python 发现
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. 总结
| 改进点 | StructureA | StructureB |
|---|---|---|
| 代码组织 | 扁平结构,所有代码在 app.py 中 | 采用包结构,app/ 作为 Flask 应用 |
| 视图管理 | 直接在 app.py 中定义 | views.py 独立存放 |
| 启动方式 | python app.py | python run.py |
| 代码可维护性 | 易出现循环导入问题 | 结构清晰,模块化管理 |
6. Flask 项目最佳实践
- 使用包结构 (
app/+__init__.py),避免循环导入问题。 - 将视图拆分为模块,避免
app.py过大。 - 使用
static/存放静态文件,并通过url_for()生成链接。 - 使用
data/存放非 URL 访问的数据,并通过app.open_resource()读取。
相关文章:
Flask 应用结构与模块化管理详细笔记
1. 代码结构优化:StructureA 最初的 Flask 项目结构适用于小型应用,但不适用于大型应用。为了改进代码结构,我们将 URL 管理应用拆分为多个模块。 1.1 StructureA 目录结构 StructureA |-- .flaskenv |-- app.py |-- views.py |-- templat…...
(八)趣学设计模式 之 装饰器模式!
目录 一、 啥是装饰器模式?二、 为什么要用装饰器模式?三、 装饰器模式的实现方式四、 装饰器模式的优缺点五、 装饰器模式的应用场景六、 装饰器模式 vs 代理模式七、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢…...
JVM线程分析详解
java线程状态: 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。 线程对象创建…...
毕业项目推荐:基于yolov8/yolo11的野生菌菇检测识别系统(python+卷积神经网络)
文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...
DeepSeek 助力 Vue3 开发:打造丝滑的页眉(Header)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
常用空间数据结构对比
空间数据结构是用来组织和查询多维空间数据的算法结构。它们在地理信息系统 (GIS)、计算机图形学、机器人导航、机器学习等领域非常重要。以下是几种常见空间数据结构的对比: 1. 四叉树(Quadtree) 适用场景:二维空间数据&#x…...
PHP应用程序设计:一个实际的例子(3)
使应用程序适用于网络 如果你正好计划用P H P开发你自己的服务程序(或者其他一些相似的东西),请重新思考一下。你可能已经对这些思想有些迷惑了:实现一个聊天服务程序意味着实现一个网络服务程序。这是我们实际上介绍给大家的东西…...
RabbitMQ 的介绍与使用
一. 简介 1> 什么是MQ 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。 其主要用途:不同进程Process/线程T…...
spring boot 连接FTP实现文件上传
spring boot 连接FTP实现文件上传 maven: <!--ftp--><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version></dependency>接口示例: ApiO…...
OpenCV给图像添加噪声
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 如果你已经有了一张干净的图像,并希望通过编程方式向其添加噪声,可以使用 OpenCV 来实现这一点。以下是一个简单的例子&a…...
Elasticsearch:使用阿里云 AI 服务进行嵌入和重新排名
作者:来自 Elastic Toms Mura 将阿里云 AI 服务功能与 Elastic 结合使用。 更多阅读,请参阅 “Elasticsearch:使用阿里 infererence API 及 semantic text 进行向量搜索”。 在本文中,我们将介绍如何将阿里云 AI 功能与 Elastics…...
管理后台环境配置
后端配置及启动 a. 软件安装 1. Java sdk 1.8 2. maven 3.6 3. intellij IDEA 2024 4. Visual C Redistributable 5. mongodb 7.0 6. mysql 8.0 双击安装:mysql-installer-community-8.0.41.0.msi 版本选择:Full,包括服务器和客户端 …...
数字IC低功耗后端设计实现之power gating和isolation技术
考虑低功耗设计需求,下图中间那个功能模块是需要做power domain的,即这个模块需要插MTCMOS。需要开启时,外面的VDD会和这个模块的LOCAL VDD形成通路,否则就是断开即power off状态。 这些低功耗设计实现经验,你真的懂了…...
【网络编程】几个常用命令:ping / netstat / xargs / pidof / watch
ping:检测网络联通 1. ping 的基本功能2. ping 的工作原理3. ping 的常见用法4. ping 的输出解释5. ping 的应用场景6. 注意事项 netstat:查看网络状态 1. netstat 的基本功能2. 常见用法3. 示例4. 输出字段解释5. netstat 的替代工具6. 注意事项 xargs&…...
sqlilab 46 关(布尔、时间盲注)
sqlilabs 46关(布尔、时间盲注) 46关有变化了,需要我们输入sort,那我们就从sort1开始 递增测试: 发现测试到sort4就出现报错: 我们查看源码: 从图中可看出:用户输入的sort值被用于查…...
视觉应用工程师(面试)
视觉应用工程师(面试) 1.自我介绍、会的技能、项目 2.相机和机械手调试过程 检查硬件,看软件驱动是否链接,调节相机和镜头保证能够识别这个物料,看接口和通讯是否正常,如:波特率,数…...
redis restore 命令的用法
Redis 的 RESTORE 命令用于将序列化后的数据(通常由 DUMP 命令生成)恢复为 Redis 的键值。它在数据迁移、备份恢复和跨实例同步等场景中非常有用。以下是详细说明: 作用 数据恢复 将 DUMP 命令生成的序列化数据重新加载到 Redis 中ÿ…...
当AI重构认知:技术狂潮下的教育沉思录
备注:文章未Deepseek R1模型辅助生成,如有不妥请谅解。 以下使原文: 我有三个娃,各间隔4到5岁,经历过搜索引擎,短视频,短剧,本身曾经也是教育专业出生,任何事务都有两面性…...
《Effective Objective-C》阅读笔记(下)
目录 内存管理 理解引用计数 引用计数工作原理 自动释放池 保留环 以ARC简化引用计数 使用ARC时必须遵循的方法命名规则 变量的内存管理语义 ARC如何清理实例变量 在dealloc方法中只释放引用并解除监听 编写“异常安全代码”时留意内存管理问题 以弱引用避免保留环 …...
穷举vs暴搜vs深搜vs回溯vs剪枝(典型算法思想)—— OJ例题算法解析思路
回溯算法的模版 void backtrack(vector<int>& path, vector<int>& choice, ...) {// 满⾜结束条件if (/* 满⾜结束条件 */) {// 将路径添加到结果集中res.push_back(path);return;}// 遍历所有选择for (int i 0; i < choices.size(); i) {// 做出选择…...
【Java项目】基于Spring Boot的校园博客系统
【Java项目】基于Spring Boot的校园博客系统 技术简介:采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介:校园博客系统是一个典型的管理系统,主要功能包括管理员:首页、个人中心、博主管理、文章分类管理、文章信息…...
计算机毕业设计SpringBoot+Vue.js图书进销存管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
算法-数据结构(图)-迪杰斯特拉最短逻辑算法( Dijkstra)
迪杰斯特拉算法(Dijkstras Algorithm) 是一种用于计算单源最短路径的经典算法,由荷兰计算机科学家 艾兹赫尔迪杰斯特拉(Edsger W. Dijkstra) 于1956年提出。它的主要目标是找到从图中的某个源节点到所有其他节点的最短…...
C语言【进阶篇】之指针——涵盖基础、数组与高级概念
目录 🚀前言🤔指针是什么🌟指针基础💯内存与地址💯指针变量💯 指针类型💯const 修饰指针💯指针运算💯野指针和 assert 断言 💻数组与指针💯数组名…...
关于命令行下的 git( git add、git commit、git push)
文章目录 关于 gitgit 的概念git 操作(git add、git commit、git push 三板斧)安装 git新建仓库及配置git clone.gitignoregit addgit commitgit push其他 git 指令git pull(把远端的东西拉到本地进行同步)其他指令 关于 git git…...
DaoCloud 亮相 2025 GDC丨开源赋能 AI 更多可能
2025 年 2 月 21 日至 23 日,上海徐汇西岸,2025 全球开发者先锋大会以 “模塑全球,无限可能” 的主题,围绕云计算、机器人、元宇宙等多元领域,探讨前沿技术创新、应用场景拓展和产业生态赋能,各类专业论坛、…...
极速探索 HarmonyOS NEXT:开启国产操作系统开发的新篇章
极速探索 HarmonyOS NEXT:开启国产操作系统开发的新篇章 一、引言二、HarmonyOS NEXT 是什么?背景核心特性 三、HarmonyOS NEXT 的发展历程从 LiteOS 到 HarmonyOS 的逐步演进HarmonyOS NEXT 5.0 的发布 四、HarmonyOS NEXT 对科技的影响技术突破开发者生…...
火狐浏览器多开指南:独立窗口独立IP教程
无论是跨境电商从业者需要管理多个店铺账号,还是海外社交媒体营销人员要运营多个社交平台账号,亦或是从事多账号广告投放的人员,都面临着一个共同的挑战 —— 如何高效管理多个账号,并确保每个账号的独立性。 在这种情况下&#…...
内容中台是什么?内容管理平台解析
内容中台的核心价值 现代企业数字化转型进程中,内容中台作为中枢系统,通过构建统一化的内容管理平台实现数据资产的高效整合与智能调度。其核心价值体现在打破传统信息孤岛,将分散于CRM、ERP等系统的文档、知识库、产品资料进行标准化归集&a…...
1.2 Kaggle大白话:Eedi竞赛Transformer框架解决方案02-GPT_4o生成训练集缺失数据
目录 0. 本栏目竞赛汇总表1. 本文主旨2. AI工程架构3. 数据预处理模块3.1 配置数据路径和处理参数3.2 配置API参数3.3 配置输出路径 4. AI并行处理模块4.1 定义LLM客户端类4.2 定义数据处理函数4.3 定义JSON保存函数4.4 定义数据分片函数4.5 定义分片处理函数4.5 定义文件名排序…...
