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

news2024/9/20 19:12:46

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_bp

def 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_app

app = 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.coloradmin.cn/o/2149788.html

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

相关文章

信息化时代下的高标准农田灌区:变革与机遇并存

在信息化时代的浪潮中,高标准农田灌区的建设与管理正经历着前所未有的变革,这既是一个挑战重重的历程,也孕育着无限的发展机遇。随着物联网、大数据、云计算以及人工智能等先进技术的飞速发展与融合应用,传统的农田灌溉模式正在被…

【Docker】安装全流程与配置完整镜像源(可安装 nginx)

目录 一、卸载历史版本(选)二、配置 yum 源三、安装 docker四、配置 docker 镜像源加速(选、强烈建议)4.1 配置阿里镜像加速4.2 配置其他镜像源 五、启动 docker参考文章与视频 本文基于 Linux - CentOS 7 操作系统。 一、卸载历史…

PG198-jesd204-phy阅读笔记

简介 介绍 JESD204 PHY IP核实现了JESD204的物理接口,简化在发送和接收核心之间共享串行收发器信息通道。此内核一般不单独使用,只能与JESD204或JESD204C内核结合使用。 特性 根据JESD204B和JESD204C草案设计   支持1至12lane配置   JESD204 IP支持…

clousx6整点报时指令怎么写?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…

对称加密算法使用示例

Demo包括以下对称加密算法组合 备注:XTS仅支持AES128和AES256,不支持AES192 from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import cmac from cryptography.hazmat.primitives.…

SpringBoot 基于 Vue 的地方美食分享网站

摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地…

smardaten无代码这么牛逼?逻辑编排不用代码!

目录 前言 经典案例 ①计划编排:数据操作自动化 ②工单派工:流程变更自动化 smardaten能力解析 一、逻辑控制篇 (1)变量定义与操作 (2)数据校验与反馈 (3)动态数据获取与回填…

企业微信oauth2提示应用无法使用

问题描述: 生成oauth2之后,我a公司是服务商,我给b公司的人去点授权链接会提示这个 应用服务商还没有在企业微信为你开通接口调用许可」,导致无法使用此应用,请联系服务商开通 正文 你先要知道一件事!&…

基于SpringBoot+Vue的“课件通”中小学教学课件共享平台

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

后端原型设计

一:导航设计 1.1 横向导航栏 常用于浏览器对客的系统。 1.2 纵向导航栏 纵向导航左边可以进行一级菜单和二级菜单,每个二级菜单右边还可以继续再使用标签栏进行导航三级分类。 头条号和CSDN都是采用该方式。 1.3 横纵结合导航栏 横向为一级菜单&…

ConvexHull-凸包-原理-代码实现

定义:凸包是包围点云的最小凸多面体,所有点都在该多面体的内部或表面上。优点:能够精确地包围点云,并且不存在额外的空白区域。缺点:计算复杂度高,尤其是在高密度点云中,生成凸包的过程较慢。 …

前后端分离项目--下载功能

文章目录 不使用代理服务器blobblob构造函数通过FormData对象的getBlob方法创建Blob对象将Blob对象转换成UR 使用代理服务器 前后端分离项目中下载与其他接口的使用不同,一般下载不走node,不通过代理服务器,而是直接在前台发送请求&#xff0…

人工智能安全治理新篇章:《2024人工智能安全治理框架1.0版》深度解读@附20页PDF文件下载

在数字化浪潮席卷全球的今天,人工智能(AI)技术正以前所未有的速度融入我们的日常生活,从智能助手到自动驾驶,从医疗诊断到金融风控,AI的身影无处不在。然而,技术的双刃剑特性也让我们不得不面对…

3657A/B/AM/BM矢量网络分析仪

苏州新利通 3657A/B/AM/BM 矢量网络分析仪 3657系列矢量网络分析仪适用于无线通信、有线电视、教育及汽车电子等领域,可用于对滤波器、放大器、天线、电缆、有线电视分接头等射频元件的性能测量。该产品采用Windows操作系统;具有误差校准功能、时域功能…

Java基础面试必知:HashMap的数据结构与扩容机制

Java基础面试必知:HashMap的数据结构与扩容机制 在Java开发中, HashMap是使用最为广泛的数据结构之一,它提供了基于键值对的快速存取功能。然而,在面试中,经常会涉及到HashMap的底层实现原理,特别是其数据…

Abp vNext(五)集成MQTTnet,可收发消息

一 前言 MQTT的相关理论内容这里不做过多介绍,请看下面两篇文章: Introduction MQTT协议中文版 MQTT协议-CSDN博客 这篇文章只做代码实现,文章中使用MQTTnet作为MQTT开发的组件。 MQTT分为服务端和客户端,一个服务端对应多个…

Docker + Win 10 学习记录

下载Docker Release notes | Docker Docs 推荐使用4.33版本,最新的Docker版本在win10 22H2无法安装。需要升级到win11. 查看Win10版本是否与最新版的Docker兼容 运行 win R, 然后输入winver 如果你的Docker版本无法在当前的win10安装,请更…

编码器-解码器架构_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录一、引言编码器解码器合并编码器和解码器小结练习答案1. 编码器和解码器是否必须是同一类型的神经网络?2. 除了机器翻译,还有其它可以适用于“编码器-解码器”架构的应用吗? 一、引言 正如我们…

LocalDateTime,OffsetDateTime和ZonedDateTime(上)

图片来源:https://www.cnblogs.com/yourbatman/p/14324575.html 一. LocalDate和LocalTime LocalDate:代表不含时区信息的日期,它只能表示年、月、日。它适用于记录一个日子,比如生日、纪念日、或者任何只需要日期而不需要具体时…

除猫毛用粘毛器还是宠物空气净化器?希喂/米家/352/范罗士/有哈空气净化器对比

微博之夜,明星互送礼物环节,要求所有嘉宾准备一份礼物,再由其他明星随机抽取互换礼物。田曦薇送粘毛器可是引起了广泛的争议和批评。不说价格,粘毛器对咱养猫人来讲还真是刚需啊。我朋友家三只猫,出门不用说啥&#xf…