我们都知道 flask 是一个轻量级的 web 框架,相对于其他同类型框架更为灵活、轻便、安全且容易上手。开发者可以随意编写自己想要的项目结构,同时还有很多的第三方库供君选择。但是灵活的同时也带来了相应的问题,比如对很多初学者来说,建的项目结构混乱,不易维护,还有经典的循环导入等问题

循环导入问题

很多初学者喜欢将启动文件和多个路由写在同一个文件中,例如以下代码:

这样一旦随着视图函数的增多,代码的可维护性会变得越来越差。所以有必要对视图函数进行拆分。
我们将其拆分成两个文件:run.py 和 view.py,其中 run.py 作为程序的启动文件,因为要将路由注册到 flask 核心对象上,所以在 view.py 中需要导入核心对象,同时 run.py 中要导入 view。最终,代码和项目结构如下所示:

run.py

view.py

但是当我启动程序,在浏览器中输入地址 http://127.0.0.1:5000/add?name=Jerry 之后,报 404 Not Found。

这是为什么呢? 为什么在 view.py 中注册的视图函数找不到呢? 原因就是因为循环导入,我们在 run.py 中导入了 view, 同时又在 view.py 中导入了 run.py 中的 app!最终导致什么结果呢,我们通过调试来发现吧!

详解循环导入

  • 启动 run, 第一次实例化一个 Flask 的核心对象 app,执行到导入 view 代码,这是第一个关键点 1!

  • 在 view.py 中,执行到导入 app 的代码,转而去执行 run.py 中的代码

  • 可以看到程序又再一次执行了 run.py 中的代码,同时又一次实例化了一个 Flask 的核心对象,为了区分,我们将它称为 app2,这是第二个关键点 2 !

由于,本次执行 _ name _ != _ main _,所以并不会执行 app.run()。那么程序将继续执行 view.py 中剩余代码

可以看到,程序将相关的路由函数注册到了 app2 上面!

当 view.py 中代码执行完成之后,将继续执行 run.py 中后面的代码。也就是前面提到的关键点 1 之后的相关代码!

此时将路由函数 index 注册到了 app 上面,同时  _ name _ == _ main _,所以 app.run() 启动成功!

通过上面的分析,总结如下:

  • 整个过程初始化了两次 Flask 核心对象,app 和 app2

  • view 中的视图函数注册在 app2 上面

  • index 视图函数注册了两次,第一次注册到 app2,最后一次注册 app 上面

  • 最终启动的核心对象是 app

现在你应该明白了,view.py 中的视图函数注册的 app 和最终启动的 app 不是同一个,所以最终导致找不到视图函数!为了能有个更直观的感受,我们可以将 app 的内存地址打印出来,这样更加一目了然!

可以看到,注册和启动的 app 不是同一个!

蓝图

解决方案:Flask 给我们提供一种机制,蓝图(Blueprint)。
蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和 URL 相互关联的功能。蓝图类似 Django 中的 app,两者的功能非常相似,帮助我们实现模块化应用的功能。

在 Flask 中可以创建多个蓝图,代表不同的功能模块。比如,上面代码中的 web 文件夹就能作为一个蓝图,另外用户相关的功能模块 user 也能创建一个相应的蓝图

蓝图应用

了解蓝图的相关功能之后,我们正式通过蓝图来解决以上问题。

  • 首先在web/_ init _.py 文件中创建蓝图:

  • 蓝图创建完之后,在 view.py 中导入对应的蓝图,并将视图函数注册到蓝图中,改造完之后如下:

  • 我们自始至终都要清楚,Flask 中的相关功能插件以及视图函数最终都要注册到核心对象上面,所以蓝图也是要注册到核心对象上面。同时要了解到,当项目功能较多,用的插件也很多的时候,核心对象的初始化以及蓝图、第三方插件的注册的相关代码会很多,这时候也要对代码进行分离。

所以在 app/_ init _.py 文件中做核心对象的初始化,同时将蓝图注册到核心对象上。代码如下:

同时在启动文件 run.py 记得导入 app 核心对象,修改后代码如下:

再次启动,我们可以看到,因为一个是蓝图,一个是 app 两者是不一致的。

验证结果

运行之后,我们在浏览器中或者用代码来验证一下:

GET 请求

POST 请求

作者:华为云享开发者

Flask 蓝图机制及应用相关推荐

  1. 【Python 实战基础】Flask 蓝图 Blueprint 怎么用以及怎么集成 Bootstrap

    目录 一.简介 二.主要知识点 三.菜鸟实战 1.创建蓝图 2.注册蓝图 3.蓝图运行结果 ​4.下载和引入 Bootstrap 5.代码目录 6.Bootstrap 运行结果 一.简介 Flask ...

  2. Flask 蓝图,数据库链接

    蓝图 使用场景 如果代码非常多,要进行归类.不同的功能放在不同的文件,把相关的视图函数也放进去. 蓝图也就是对flask的目录结构进行分配(应用于小,中型的程序) 当然对于大型项目也可以通过   ur ...

  3. Flask 蓝图 Blueprint

    为什么需要蓝图? 我们在使用Flask框架,是从写单个文件,执行hello world开始的.我们在这单个文件中可以定义路由.视图函数.定义模型等等.但这显然存在一个问题:随着业务代码的增加,将所有代 ...

  4. flask蓝图的使用

    首先,我对蓝图的理解相对通俗,就是觉得蓝图对于视图方法模块化.大项目协同开发过程中的一个很好的工具. 1.下图是我们通常情况下使用的项目组织结构 看一下视图方法: #views.py 1 from a ...

  5. flask 蓝图 使用蓝图,增删改查用户

    Flask 中的  蓝图 蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统, ...

  6. Flask蓝图使用的方法

    之前我们已经通过代码了解了一些Flask基本的用法,现在出现一个问题,我们要做的功能越来越多,路由是不是都要放在启动类中呢?例如我们在不同的文件都定义了一些路由,如果想要访问他们,是不是要开启很多个不 ...

  7. Day4 --- Flask 蓝图与Rest-ful

    蓝图 蓝图的使用步骤分为三步: 1.创建一个蓝图对象 2.在这个蓝图对象上进行操作, 注册路由, 指定静态文件夹, 注册模板过滤器 3.在应用对象上注册蓝图对象 开始创建 蓝图的实现 创建一个app. ...

  8. flask + 蓝图 用 sqlalchemy 对 mysql 进行 增删查改 的 demo

    main.py import uuid # UUID: 通用唯一标识符 # from flask import Flask from flask import Flask, request, json ...

  9. python polygon函数_Python 人脸识别就多简单,看这个就够了!

    点击上方"Python编程与实战",选择"置顶公众号" 第一时间获取 Python 技术干货! 阅读文本大概需要 11分钟. 今天给大家介绍一个世界上最简洁的人 ...

最新文章

  1. Nginx配置文档具体解释
  2. 数值范围_如何理解PLC对数值运算的定义与处理方式?
  3. Android Settings中显示自定义dialog
  4. 六元均匀直线阵的各元间距为_实验二 均匀直线阵
  5. jQuery.form 的最新版本是 3.14
  6. 查找在Git中删除文件的时间
  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(59)-BLL层重构
  8. matlab学习笔记1
  9. Android刷机Windows10,蓝魔i9s Win10+Android双系统的刷机教程及固件下载
  10. MySQL入门学习笔记
  11. 局域网文档服务器搭建,局域网服务器的搭建.pdf
  12. 计算机 仿真 流体力学剪切应力,基于影像的计算流体力学在冠状动脉疾病中的研究进展...
  13. 51单片机电子制作DIY-----交通灯控制器
  14. macmini更换硬盘重装系统后安装win10双系统
  15. C语言中char字符为0时的情况
  16. Lwip之PPP、PPPoE实现(一)
  17. cisco 防火墙模拟器_37、如果手头有华为AP,怎们配合模拟器做部分实验呢?(完结篇)...
  18. android动画封装,Android开场动画类完整实现代码
  19. java 文件移动_java 文件移动
  20. YUV2RGB Opencv

热门文章

  1. 五.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---3.laserOdometry.cpp--前端雷达里程计和位姿粗估计
  2. android menu width,如何更改Android PopupMenu宽度
  3. history 改成 模式_前端路由三种模式
  4. mysql oracle 锁机制_Mysql锁机制
  5. mysql数据库原理与应用武洪萍第三张答案_mysql数据库武洪萍版第四章习题与答案...
  6. 自考专科计算机信息管理专业好,计算机信息管理(专科)专业介绍
  7. vue、nuxt性能优化
  8. (1)DBA查询:数据库
  9. Chrome OS 70 发布:这是安卓的私生子吗?
  10. 【转载】前后端分离的思考与实践(五)