版权声明:原创,如有需要,请标明文章出处,写写合作 https://blog.csdn.net/bingdianerer/article/details/87911654
上节回顾
- 什么是HTTP协议?有什么优缺点?
- HTTP协议常用的请求方法?
- HTTP协议报文的构成?
- HTTP协议常见的状态码?
- FLASK怎么发送GET请求和POST请求?
- FLASK怎么接收传递的参数?
结构化拆分
-
为什么需要结构化拆分?
- 代码臃肿,不易维护。
- 扩展不易,耦合度高。
-
结构化拆分结构(结合本人日常开发的经验)
以上的结构是不是感觉结构很清晰? 那么现在我们将按着这个结构一点点的实现。
- 首先引入配置文件
config.py
- 启动文件引入
index.py
- 启动程序
-这样启动程序就会读取到配置文件的信息了,而不需要都写在一个文件中,实现了简易的拆分
- 首先引入配置文件
-
我们新建
user.py
文件
-
index.py
-
运行程序
-
运行结果
-
是不是和我们预想的不一样,为什么呢? 因为user.py和index.py没有建立关系吧,或者说user.py没有注册到index.py中,那么我们改写代码。
-
改写
index.py
-
运行程序
-
运行结果
为什么会出现这样的情况呢?原因就是循环导入的问题,由循环导入实例化了两次app,走路由的app和进入if __name__的app不是一个,所以造成以上的结果,我们做一个实现来证明这个问题
- 我们在user.py中加一个打印语句
- 我们在index.py中一个打印语句
- 运行结果
- 我们在user.py中加一个打印语句
-
我们发现路由中的app的地址和运行app的地址不一样,所以结果依然报错,这就是一个循环导入问题,我们用一张图表捋一下执行过程
- 解释
- 当启动程序之后,文档流自上之下执行,先进入server.py文件,导入flask模块
- 我看见app = Flask(name) 实例化app , app获得一个地址app1
- 继续向下执行,导入user模块
- 我进入user模块
- 在 user模块中,我遇见了 from server import app 这个导入
- 那我在回到server 模块
- 我又看见 app = Flask(name),那么app再次实例化,是不是这个app地址和上一次的不一样了?
- 继续向下执行,看见 import user 了 ,还需要在进入user模块吗? 不需要了,因为模块只需导入一次。这样形成了一个循环导入
- 这次过来 name 是什么? 她是在user模块中过来的,那么__name__ 是不是 user ? 所以在user中的 from server import app 中的蓝线到此截至了。
- 接着,我们走 app.route() 现在的这个app 是不是 app第二次实例化的地址?
- 然后进入 server 中,
__name__
是不是__main__
因为这次是 import user之后,user全部走完后回来的,主体还是在server中完成的,那么__name__
就是__main__
- 进入 if 语句
- app 是 第一次实例化的地址,启动程序。
- 解释
-
-
这就是出现404的原因。因为实例化了两次,而路由所有的app地址最终没有进入if 主函数里 所以才会出现404的问题。