如何理解flask中的蓝本?
程序员文章站
2022-06-16 13:48:24
...
回复内容:
恩,理解「蓝本」对于没有接触其他Web编程实现的Python+Flask新手而言,是一个不好迈过的坎儿。我得用「比喻」的方式穿插讲述一下「蓝本」,方便你更好理解,问这个问题估计是新手,所以我啰嗦点好了。
首先,提一下概念,「蓝本」的对应官方词汇是「Blueprint」,中译还有「蓝图」这种叫法,是一种东西。
你去餐馆吃饭,点一些菜,你一定吃过「麻辣香锅」这种东西。你可以点一些杂七杂八的菜,选好口味,之后一个碗儿端上来,你吃的很滋味,并且也会觉得这种「一锅端」的方式很好,毕竟不会一道吃完等下一道啊,一起上来热乎乎的多好。并且吃的很少的时候,一点点的菜单独用一个碗儿装也是有点「装逼」的事情。
假如你一个人一己之力要写一个BBS(论坛系统)的话,上面的这个例子,其真实写照是初期功能很弱时,可能页面不多,实现的功能也很少。可能首页就是一个帖子列表,允许用户发布帖子,并且不涉及登录退出、会员等级、权限管理等,你想着,那是后面再说的事情。于是,你将网站主干代码写在一个run.py文件里,让网站成功的跑了起来,你觉得这样实现很方便,快捷。
如果我让你这个时候把run.py理一下,能独立出来的独立成其他的文件,之后在run.py里导入,你要骂我「装逼」了,没事找事。是的,「蓝本」并不适合用来构建想当简单的网站系统。
然而,你胃口变大了,你也有了好朋友,你们要一起去吃饭。于是你遇到一些问题:
- 你的朋友不喜欢吃某些东西,但你喜欢吃。你朋友喜欢吃的一些东西,你不喜欢吃。
- 人多了,点的东西多了,你们想如果吃不完可以打包明天吃,但是你们打包还是要挑一些菜打包的,毕竟有些菜隔夜就味道不好,容易坏掉。
- 你和你的朋友都想先吃一种东西,然后再吃一种东西。比如先吃点荤的,然后吃点素的解解荤。
类似的,当你的BBS系统越来越复杂,有了登录退出、会员等级、权限管理等等功能后,问题迎面而来:
- run.py文件肯定越来越大,代码行数越来越多。你网站所有的路由写在一个文件里,功能也在一个文件里,很容易出现错误,并且难以定位。当然,你如果没实战经验,确实不能切身体会这点。那么我说另一个显而易见的问题:import(导入)和config(配置)一般写在头部,你的新路由按顺序怎么也得写在几百行开外的地方,于是你编程时一下看代码文件最上面,一下拖到底部继续写,这就够「操蛋」的了。
- 大型网站一定是多人编程,如果此刻安排你做登录退出功能,你的朋友做权限管理功能,那么老板当然不容忍你干完你朋友才开工,一起开干啊!可是此时只有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即可。 对于大型应用把应用分隔为小块,每个小块使用蓝图辅助执行