第五章:结构化拆分和循环导入

版权声明:原创,如有需要,请标明文章出处,写写合作 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中一个打印语句
        在这里插入图片描述
      • 运行结果
        在这里插入图片描述
    • 我们发现路由中的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的问题。

猜你喜欢

转载自blog.csdn.net/bingdianerer/article/details/87911654