Home  >  Article  >  Backend Development  >  如何理解flask中的蓝本?

如何理解flask中的蓝本?

WBOY
WBOYOriginal
2016-06-06 16:22:501787browse

回复内容:

恩,理解「蓝本」对于没有接触其他Web编程实现的Python+Flask新手而言,是一个不好迈过的坎儿。

我得用「比喻」的方式穿插讲述一下「蓝本」,方便你更好理解,问这个问题估计是新手,所以我啰嗦点好了。

首先,提一下概念,「蓝本」的对应官方词汇是「Blueprint」,中译还有「蓝图」这种叫法,是一种东西。
你去餐馆吃饭,点一些菜,你一定吃过「麻辣香锅」这种东西。你可以点一些杂七杂八的菜,选好口味,之后一个碗儿端上来,你吃的很滋味,并且也会觉得这种「一锅端」的方式很好,毕竟不会一道吃完等下一道啊,一起上来热乎乎的多好。并且吃的很少的时候,一点点的菜单独用一个碗儿装也是有点「装逼」的事情。
假如你一个人一己之力要写一个BBS(论坛系统)的话,上面的这个例子,其真实写照是初期功能很弱时,可能页面不多,实现的功能也很少。可能首页就是一个帖子列表,允许用户发布帖子,并且不涉及登录退出、会员等级、权限管理等,你想着,那是后面再说的事情。于是,你将网站主干代码写在一个run.py文件里,让网站成功的跑了起来,你觉得这样实现很方便,快捷。
如果我让你这个时候把run.py理一下,能独立出来的独立成其他的文件,之后在run.py里导入,你要骂我「装逼」了,没事找事。是的,「蓝本」并不适合用来构建想当简单的网站系统。

然而,你胃口变大了,你也有了好朋友,你们要一起去吃饭。于是你遇到一些问题:
  1. 你的朋友不喜欢吃某些东西,但你喜欢吃。你朋友喜欢吃的一些东西,你不喜欢吃。
  2. 人多了,点的东西多了,你们想如果吃不完可以打包明天吃,但是你们打包还是要挑一些菜打包的,毕竟有些菜隔夜就味道不好,容易坏掉。
  3. 你和你的朋友都想先吃一种东西,然后再吃一种东西。比如先吃点荤的,然后吃点素的解解荤。
以上,如果你们还去吃「麻辣香锅」,就都不开心了,你想想看。
类似的,当你的BBS系统越来越复杂,有了登录退出、会员等级、权限管理等等功能后,问题迎面而来:
  1. run.py文件肯定越来越大,代码行数越来越多。你网站所有的路由写在一个文件里,功能也在一个文件里,很容易出现错误,并且难以定位。当然,你如果没实战经验,确实不能切身体会这点。那么我说另一个显而易见的问题:import(导入)和config(配置)一般写在头部,你的新路由按顺序怎么也得写在几百行开外的地方,于是你编程时一下看代码文件最上面,一下拖到底部继续写,这就够「操蛋」的了。
  2. 大型网站一定是多人编程,如果此刻安排你做登录退出功能,你的朋友做权限管理功能,那么老板当然不容忍你干完你朋友才开工,一起开干啊!可是此时只有run.py一个文件,没错,你和你的基友可以各自拷贝一份run.py各自开始写,结果你的代码从第100行开始写,你的朋友也从100行开始写,然后你们还各自在头部import了一些新东西。等写好了,怎么办?线上就一个run.py,这下「糟糕」了,苦苦「合并」代码吗?这更「操蛋」了。如果10个人写网站呢?——「蛋蛋艹碎了」
所以,你此刻第一反应当然是「麻辣香锅」吃不成了,这「一碗菜是一碗菜」的方式是最佳的解决方案,爱吃什么吃什么,爱打包哪碗直接装起来,不用拿着筷子挑。
当你利用Python+Flask构建一个网站时,人为的提炼一些代码独立成文件是「不妥」的方式,你需要Flask本身给予一些支持,于是「蓝本」出现了。

「蓝本」允许你将不同路由分开,提供一些「规范(标准)」,并且附带了很多好处。你可以要求商家不同的菜上来装不同的盘子,就像你也可以要求「蓝本」针对不同路由应用不同静态资源,导致不同的URL出现不一样的网站界面(否则前端CSS就混杂了)。
「蓝本」使得你和基友一起工作时不会再有上面的麻烦事,你改你的A文件,他改他的B文件,回头各自提交各自的,多好。
「蓝本」让你做另一个程序时,如果那个程序也有登录退出,理想情况下你甚至可以直接将BBS负责登录退出的部分直接挪过去用,这远比直接从一个run.py里复制出代码现实的多,要知道即使一个登录退出的功能,你在一个run.py里实现,代码会散落在各处的。

「蓝本」还有其他好处,其实本质上来说就是让程序更加松耦合,更加灵活,增加复用性,提高查错效率,降低出错概率。

以上,我所说的针对「小白」新手,如果你有一定的实践经验,官方的文档写得更准确些:使用蓝图的模块化应用

希望我的回答帮你绕好弯子。: P 可参考这个,蓝图 | Flask之旅 blueprint把实现不同功能的module分开.

Factor an application into a set of blueprints.
把一个大的application分割成各自实现不同功能的module.

Register a blueprint on an application at a URL prefix and/or subdomain.
在一个blueprint中可以调用另一个blueprint的view function, 但要加相应的blueprint名.

Register a blueprint multiple times on an application with different URL rules.
没用过! 在其他文件中写功能,然后在主运行文件中导入。
实际上是一个路由系统。 本主也是新手,可以理解为大的楼盘(app)不同的单体建筑(class),单体建筑又有很多户(function)。


蓝图类似于一个类,也需要注册和实例化,只不过在项目中的位置不同,引用方式不同而已。

确切土木也有蓝图,但非彼蓝图,呵呵 主要用于模块化路由,路由太多了,用蓝本打包分类下。 不同的情况下,比如开发环境和生产环境可能有不一样的需求。通过把路由注册到某一个blueprint上,互不干扰,根据自己的需求替换绑定的blueprint即可。 对于大型应用把应用分隔为小块,每个小块使用蓝图辅助执行
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn