通过蓝图Blueprint完成项目拆分、模块化以及模块化后项目结构分析

1、不拆分项目之前的写法

在上一篇Flask入门和视图中我们讲解了Flask项目的一个启动流程,引入Flask、创建Flask对象,然后由路由进入在视图函数中通过模版渲染或者json系列化的方式返回页面或者数据。我们发现这些所有的操作都是在一个页面中完成的,也就是所有功能写在python启动页面app.py中,代码如下:

# 导入Flask
from flask import Flask
# 创建Flask应用对象
app = Flask(__name__)# 路由route + 视图函数hello_world
@app.route('/')
def hello_world():# 响应:返回给浏览器的数据return 'Hello World!'if __name__ == '__main__':# 启动服务器app.run()

这个项目简单那就没问题,但是如果项目稍微复杂一点、有好多的功能,那这个页面就会非常的复杂也不利于开发和维护,所以我们需要对项目进行拆分,比如把视图和数据处理分开、项目模块分开。

2、项目拆分模块化的思路

在接下来的讲解中我们结合实际项目来说明,假如现在有一个项目,主要实现两个模块的功能,一个是登录(login)相关的功能,一个是主页(main)相关的功能。

我们的想法是通过一个页面来管理login相关的功能,把路由和视图函数完全写在里面,通过另一个页面来管理main相关的功能,这样的话就更好维护。

比如:

1、建项目的时候分别创建blueprints、models、static、templates文件夹,分别管理视图、模型数据、静态文件、模版文件

2、分别在这几个文件夹中建login和main两个文件夹,分别来管理各自的模块,各个功能模块放到各自的文件夹中,这样就把项目模块化了,结构更清晰,开发维护也更容易

3、项目结构分析

根据上面的思路我们开始建项目

1、App下的blueprints文件夹

根据上面的项目需求,分别用两个蓝图来管理,分别是blueprints下面的login和main两个文件夹,这里以login相关功能来举例,login下创建了views.py文件夹,在views中创建蓝图,后续login相关的功能都可以在这个文件下实现,同理,也在main文件夹下创建views文件,在views文件中创建蓝图,来管理main相关的路由和视图函数。注意:大家看到login和home文件夹下都有一个__init__文件,这个可以不实现里面的内容,但是必须要有)

这里提到了蓝图,什么事蓝图?

蓝图实际可以理解为是一个存储一组视图方法的容器对象,可以通过一个蓝图对象管理路由以及视图函数,蓝图不是一个完整的应用,不能独立运行,只能注册到应用中。一个应用可以具有多个蓝图Blueprint

蓝图的使用可以分两个步骤,一个是创建,一个是注册

蓝图的创建

上面blueprints/login/views文件中完成了蓝图的创建,也就是创建了管理login相关路由以及视图函数的蓝图


from flask import Blueprint
#创建login页面的蓝图
login_bp = Blueprint('login',__name__,template_folder='templates',static_folder='static')@login_bp.route('/login')
def index():return '这个是login的跟页面'

blueprints/main/views文件中完成了蓝图的创建,也就是创建了管理main相关路由以及视图函数的蓝图

from flask import Blueprint
#创建login页面的蓝图
main_bp = Blueprint('main',__name__,template_folder='templates',static_folder='static')@main_bp.route('/home')
def index():return '这个是main的跟页面'

2、App下的__init__.py文件

该文件是项目的初始化文件,在这个文件中引入了Flask和蓝图,创建Flask对象以及注册蓝图都在这里面完成

蓝图的注册
from flask import Flask
from App.blueprints.login.views import login_bp
from App.blueprints.main.views import main_bpdef create_app():app = Flask(__name__)#注册蓝图app.register_blueprint(blueprint = login_bp)app.register_blueprint(blueprint = main_bp,url_prefix='/main')return app

注意: App.blueprints.login.views是蓝图的路径App是根路径

            url_prefix='/mainhttp://127.0.0.1:5000自动加上该路径

3、入口文件,app.py

该文件为入口文件,文件中通过from import在App文件夹中导出__init__中的create_app方法,该方法返回了注册过蓝图的Flask对象,通过这个Flask对象.run实现项目运行

from App import create_appapp = create_app()if __name__ == '__main__':app.run(debug=True)

启动项目后,先访问到app.py 文件,该文件通过create_app方法获取到App下__init__文件中的Flask对象app,该app已经注册了main以及login两个蓝图,这样就完成了一个小型的项目。输入http://127.0.0.1:5000/login返回 “这个是login的跟页面”,输入http://127.0.0.1:5000/main/home返回“这个是main的跟页面”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540249.html

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

相关文章

不只是模仿,伯克利新研究赋予机器人跨实体自主学习的能力,零样本时代已来

导读: 在当今科技飞速发展的时代,机器人技术正不断地给我们带来惊喜和变革。2024 年 9 月,一篇来自加州大学伯克利分校、丰田研究所和Physical Intelligence 的研究论文RoVi-Aug: Robot and Viewpoint Augmentation for Cross-Embodiment Rob…

C++ | 二叉搜索树

前言 本篇博客讲解c中的继承 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢迎大家点赞&…

超详细!百分百安装成功pytorch,建议收藏

文章目录 一、Anaconda安装1.1下载anaconda1.2配置Anaconda环境1.3验证anaconda是否安装成功 二、查看电脑显卡三、更新显卡驱动3.1下载驱动3.2、查看显卡驱动版本 四、cuda安装4.1CUDA下载4.2CUDA环境配置4.3验证CUDA是否安装成功 五、安装pytorch4.1下载pytorch5.2验证pytorc…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】上

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核(LiteOS-M) 轻量系统内核&#…

力扣 18.四数之和

文章目录 题目介绍解法 题目介绍 解法 思路和 15. 三数之和 一样,排序后,枚举 nums[a] 作为第一个数,枚举 nums[b] 作为第二个数,那么问题变成找到另外两个数,使得这四个数的和等于 target,这可以用双指针…

《线性代数》常用公式定理总结

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算(化为基本型)1.5.1 主对角线行列式:主…

git 本地分支误删,怎么恢复?误删本地已提交未推送的分支!

误删本地已提交未推送的分支! 前提: 已提交! 重点:未推送! 要是推送了,再拉一下代码就行了。你也不会来搜这个帖子了。 如果你删除的分支里有你未提交的代码,不用往下看了,帮不到你…

树莓派4B+UBUNTU20.04+静态ip+ssh配置

树莓派4B+UBUNTU20.04+静态ip+ssh配置 1.烧录Ubuntu镜像1.1选择pi 4b1.2选择ubuntu server (服务器版,无桌面)20.041.3选择sd卡1.4 点击右下角 NEXT ,编辑设置,输入密码,wifi选CN, 开启ssh1.5 烧录,依次点击“是”,等待完成2 烧录完成后装入树莓派,上电,等待系统完成配…

电竞显示器哪个牌子好

电竞显示器哪个好?你想成为电竞选手吗?显示器很关键,下面我就列举7款市面流行的电竞显示器给大家看看,总有一款适合你。 1.电竞显示器哪个好 - 蚂蚁电竞 ANT255VF电竞显示器 一、产品概述 蚂蚁电竞 ANT255VF电竞显示器是一款专为…

鱼哥好书分享活动第31期:如何构建出更好的大模型RAG系统?《大模型RAG实战》

鱼哥好书分享活动第31期:如何构建出更好的大模型RAG系统?《大模型RAG实战》 S1 初级RAGS2 高级RAG模型测策略测模型微调测 S3 超级RAG购买链接:内容简介:赠书抽奖规则: ChatGPT爆火之后,以ChatPDF为首的产品组合掀起了…

Node-red 某一时间范围内满足条件的数据只返回一次

厂子里有个业务需求增加一段逻辑,根据点位数值,判断是否让mes执行之后的逻辑。 网关采集周期5s/次,及数据上报周期5s/次; iot通过网关写入时间为8s左右; 同类设备共用一条规则链; 想当触发条件时修改”完成上传“不…

简单题67.二进制求和 (java)20240919

题目描述: Java: class Solution {public String addBinary(String a, String b) {StringBuilder result new StringBuilder();int i a.length()-1;int j b.length()-1;int carry 0; //记录进位信息while(i>0 || j>0 || carry!0){int sum ca…

[Linux#55][网络协议] 序列化与反序列化 | TcpCalculate为例

目录 1. 理解协议 1.1 结构化数据的传输 序列化与反序列化 代码感知: Request 类 1. 构造函数 2. 序列化函数:Serialize() 3. 反序列化函数:DeSerialize() 补充 4. 成员变量 Response 类 1. 构造函数 2. 序列化函数:…

免费下载PDF | 自然语言处理新范式:基于预训练模型的方法

前言 本次给大家推荐阅读的书籍是——《自然语言处理:基于预训练模型的方法》。近些年来,以GPT、BERT为代表的预训练模型在自然语言处理领域掀起了一股浪潮,打开了“预训练精调”的自然语言处理新范式的大门。 由电子工业出版社出版的《自然…

动手学深度学习(pytorch土堆)-06损失函数与反向传播、模型训练、GPU训练

模型保存与读取 完整模型训练套路 import torch import torchvision.datasets from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterfrom model impo…

AV1 Bitstream Decoding Process Specification--[7]: 语法结构语义-3

原文地址:https://aomediacodec.github.io/av1-spec/av1-spec.pdf 没有梯子的下载地址:AV1 Bitstream & Decoding Process Specification摘要:这份文档定义了开放媒体联盟(Alliance for Open Media)AV1视频编解码…

分发饼干00

题目链接 分发饼干 题目描述 注意点 1 < g[i], s[j] < 2^31 - 1目标是满足尽可能多的孩子&#xff0c;并输出这个最大数值 解答思路 可以先将饼干和孩子的胃口都按升序进行排序&#xff0c;随后根据双指针 贪心&#xff0c;将当前满足孩子胃口的最小饼干分配给该孩…

再次理解UDP协议

一、再谈端口号 在 TCP / IP 协议中&#xff0c;用 "源 IP", "源端口号", "目的 IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n 查看) 我们需要端口号到进程的唯一性&#xff0c;所以一个…

Obsidian如何粘贴的图片类似于Typora,图片相对当前路径

添加插件 下载插件&#xff1a; Custom Attachment Location 基础设置 同时需要在下面进行设置 示意效果

大数据多集群数据作业和集群状态监控

目前手里面有四套大数据集群的作业需要维护&#xff0c;分别属于不同的客户&#xff0c;我同岗位的兄弟离职后&#xff0c;所有的数据作业都落到我头上了&#xff0c;公司也不招人了。开发新的数据作业倒没有什么问题&#xff0c;就是客户叫我补数的时候&#xff0c;头比较大&a…