Flask 蓝图机制及应用

简介: Flask 蓝图机制及应用


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

循环导入问题

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

这样一旦随着视图函数的增多,代码的可维护性会变得越来越差。所以有必要对视图函数进行拆分。

我们将其拆分成两个文件:run.py 和 view.py,其中 run.py 作为程序的启动文件,因为要将路由注册到 flask 核心对象上,所以在 view.py 中需要导入核心对象,同时 run.py 中要导入 view。最终,代码和项目结构如下所示:

run.py

1# coding: utf-8
 2__author__ = 'Jerry'
 3
 4from flask import Flask
 5
 6app = Flask(__name__)
 7
 8from app.web import view
 9
10
11@app.route("/")
12def index():
13    return 'Hello World'
14
15
16if __name__ == '__main__':
17    app.run()

view.py

1# coding: utf-8
 2__author__ = 'Jerry'
 3from flask import request
 4
 5from run import app
 6
 7@app.route("/add")
 8def add():
 9    name = request.args.get("name")
10    return f"Add {name}"
11
12@app.route("/delete")
13def delete():
14    name = request.args.get("name")
15    return f"Delete {name}"
16
17@app.route("/change",methods=["POST"])
18def change():
19    num = request.json
20    return f"change {num}"

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

404

而 127.0.0.1:5000/ 却能正常响应!

200

这是为什么呢? 为什么在 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 也能创建一个相应的蓝图

640.jpg


蓝图应用

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

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

1# coding: utf-8
 2__author__ = 'Jerry'
 3from flask import Blueprint
 4
 5api = Blueprint('api', __name__)
 6
 7from app.web import view
 8
 9if __name__ == '__main__':
10    pass


  • 蓝图创建完之后,在 view.py 中导入对应的蓝图,并将视图函数注册到蓝图中,改造完之后如下:
1# coding: utf-8
 2__author__ = 'Jerry'
 3from flask import request
 4
 5from . import api
 6
 7print(f"注册view中的app: {id(api)}")00000
 8
 9@api.route("/add")
10def add():
11    name = request.args.get("name")
12    return f"Add {name}"
13
14@api.route("/delete")
15def delete():
16    name = request.args.get("name")
17    return f"Delete {name}"
18
19@api.route("/change", methods=["POST"])
20def change():
21    num = request.json
22    return f"change {num}"


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

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

640.png

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

640.png

run.py

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

640.png

验证结果

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

GET 请求

POST 请求


640.png完美!

相关文章
|
22天前
|
监控 安全 测试技术
正确配置Flask以提高应用的安全性
正确配置Flask以提高应用的安全性
108 65
|
4月前
|
监控 测试技术 Docker
【步步惊心】Flask应用云端之旅:从本地调试到一键上线的终极秘籍!
【8月更文挑战第31天】本文详细介绍了将基于Flask框架的Web应用从本地开发环境部署到云平台的全过程。首先,通过示例代码展示了如何搭建本地环境并测试应用。接着,讲解了如何使用Docker构建生产环境镜像。最后,以Heroku为例,说明了如何将应用部署到云平台,并介绍了监控与维护的方法。通过本文的最佳实践,你可以轻松完成Flask应用的部署。
57 0
|
2月前
|
前端开发 JavaScript 中间件
七、Flask蓝图使用之七
七、Flask蓝图使用之七
46 0
|
4月前
|
数据可视化 前端开发 数据挖掘
【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
本文介绍了一个基于Python Flask框架的广州历史天气数据应用与可视化大屏系统,该系统通过数据采集、处理、分析和可视化技术,提供了丰富的气象数据展示和决策支持,帮助用户快速了解和应对气象变化。
113 3
【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
|
4月前
|
存储 Linux 开发工具
【Azure App Service】本地Git部署Python Flask应用上云(Azure App Service For Linux)关键错误
【Azure App Service】本地Git部署Python Flask应用上云(Azure App Service For Linux)关键错误
|
4月前
|
存储 SQL 安全
【绝密攻略】Flask应用如何抵御黑客入侵?七大安全技巧助你构建固若金汤的Web防线!
【8月更文挑战第31天】安全性是Web应用开发中的关键部分。Flask作为一款轻量级且高度可定制的框架,虽灵活但需开发者确保应用安全。本文介绍如何通过具体措施加固Flask应用,包括更新依赖项、启用CSRF保护、使用HTTPS、安全存储密码、防止SQL注入及清理用户输入等。通过示例代码展示如何在实际开发中应用这些策略,帮助提升应用安全性,为用户提供更可靠的服务。
140 0
|
4月前
|
Python Windows 内存技术
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?
|
5月前
|
存储 数据库 开发者
Flask中的蓝图与插件应用:构建模块化Web应用的利器
【7月更文挑战第19天】Flask蓝图和插件是构建模块化、可扩展和可维护Web应用的强大工具。蓝图允许你将应用分割成多个独立的部分,提高了代码的组织性和可重用性;而插件则为Flask应用提供了丰富的功能和社区支持,简化了开发过程。通过合理地使用蓝图和插件,你可以更加高效地开发出高质量的Web应用。
|
5月前
|
安全 开发者 Python
告别迷茫,Django/Flask深入应用指南,让你的Web梦想照进现实!
【7月更文挑战第13天】在Python Web开发中,Django和Flask框架各具特色。Django适合快速构建企业级应用,提供ORM、模板引擎等全面功能;而Flask轻量灵活,适用于小项目和原型开发。通过实例,了解如何启动Django和Flask的基本应用,从创建项目到运行服务器。选择框架应考虑项目需求和个人偏好,不断学习与实践将助你实现Web梦想。
55 1
|
6月前
|
开发框架 开发者 Python
使用 Flask 为 Web 应用添加路由
通过学习 Flask 中的视图函数和路由规则,你可以使用 Flask 构建强大的 Web 应用程序并为其添加功能。在 Flask 中,视图函数以 Python 函数的形式定义,每个视图函数都与一个 URL 相关联。在 Flask 中,URL 处理程序被称为视图函数,它们用于响应客户端请求并返回响应。在 Flask 应用程序中,这是可选的。在这里,我们将其命名为 'hello',并将其与 URL '/hello/<name>' 绑定在一起。在上面的示例中,我们使用了默认的视图函数名称 'hello'。
54 2