flask大型程序的结构学习中遇到的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CC__Cloud/article/details/53373511

1、init_app的作用

首先,附上init_app()代码的截图


在app下面的__init__.py文件里面,也对这个函数进行的调用

不知道有没有小伙伴跟我有一样的困惑,此处的init_app()函数的作用是什么?存在的意义是什么?因为这个函数看起来好像什么也没有做?
怀着不知道这个函数是做什么的这个疑问去网上找了资料,结果很尴尬,所有能找到的回答都是这个函数在目前就是什么也没有做,只是为了方便以后项目的扩展,先在此处写下这个函数

2、在__init__.py文件里面,为为什么实例化flask扩展和初始化flask扩展要分开


代码如下所示:
要明白这个问题,你首先要明白两个问题
(1)python里面对象实例化和初始化的区别
(2)python里面对象初始化的两种方式
对于第一个问题,给大家一个参考链接python实例化和初始化的区别,总结的说,就是python函数在初始化的时候,先去隐式的调用的__new__函数去进行实例化,再去调用__init__函数进行初始化,__new__函数才是实际上的实例化函数,而__init__函数起到的作用就是对对象进行初始化
对于第二个问题,python对象初始化的两种方式
(1)直接app实例化,比如mail = Mail(app)
(2)先创建对象,再去调用init_app()函数进行初始化,而此处就是第二种初始化方式
好了,解决完上面两个问题,为什么把初始化函数和实例化函数分开这个问题就好解决了,看这本书的人应该知道,这个项目的整体构造,一般,在一个项目里面,可以创建一个实例,初始化多个扩展,注册多个蓝本

所以,大家把这个项目里面其他所有蓝本都有可能用到的东西都放在__init__.py文件里面,比如,一个实例的创建,很多蓝本都可以用到的扩展(例如db, mail, bootstrap……)的初始化,但是,但是,但是,因为已经把实例的创建放到了可显示调用的函数里面,在app = Flask(__name__)这句话执行之前(也就是app实例初始化之前),扩展是不可以进行初始化的,所以只能把扩展的初始化放在app = Flask(__name__)这句话执行之后,但是,其他的文件里面可能会用到什么都db,mail这样的实例,所以,又不能把实例的创建放到current_app()函数里面,唯一一个办法,将扩展的实例化和初始化分开,所以,这样的结构也就是必然的

3、项目的整体构造

不知道小伙伴们在快看完这一章的时候有没有这么一个问题,这个项目的整体构造为什么是这样的,而且,这个__init__.py的作用是什么?
 
在弄清楚了什么是蓝本之后,我才明白这个项目的整体构造,在上面已经说过,在一个项目里面,可以创建一个实例,初始化多个扩展,注册多个蓝本,而此处的main表示的就是一个蓝本,在main里面的__init__函数里面,创建了一个蓝本的实例,而main文件夹里面的其他东西也是这个蓝本所需要用到的,大家可以把这个main理解为一个模块,一个处理某个业务的整体模块,而在app下面的__init__.py文件夹里面,创建的是一个实例,是其他模块(mian或者叫蓝本)都可能用到的,而email.py, models.py也是其他蓝本可以用到的,这样一来,项目结构就清晰简洁了,在app下面的文件(除蓝本之外)都是其他蓝本可能会用到的,公共的,在单个的蓝本里面(main)写的就是所有自己蓝本的东西


展开阅读全文

没有更多推荐了,返回首页