百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Flask 蓝图机制及应用(flask 蓝图嵌套)

toyiye 2024-08-21 01:55 4 浏览 0 评论

原创: Jerryning Python编程与实战



我们都知道 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 也能创建一个相应的蓝图

蓝图应用

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

  • 首先在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 文件中做核心对象的初始化,同时将蓝图注册到核心对象上。代码如下:

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

run.py

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

验证结果

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

GET 请求

POST 请求

完美!

最后,我自己是一名从事了多年开发的Python老程序员,辞职目前在做自己的Python私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的Python学习干货,可以送给每一位喜欢Python的小伙伴,想要获取的可以关注我的头条号并在后台私信我:01,即可免费获取。

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码