一, 上节回顾:
1) flask 最小应用代码.
- from flask import Flask
- App = Flask(__name__)
- @App.route('/hello')
- def hello():
- return 'hello'
- if __name__ == '__main__':
- App.run()
2) flask 路由实现
@App.route('/') , 路由装饰器, 本质上是调用 App.add_url_rule() 方法实现的路由规则
3) flask 启动参数
host: 主机
port: 端口
debug: 是否开启调试模式
4) if __name__ == '__main__' 的理解
在本文件中启动 __name__ 就是 __main__
如果是导入其他模块 __name__ 就是 模块的名称
5) 视图函数和普通函数的区别?
普通函数: 可以返回字符串, 字典, 元组, 整型等基本数据类型
视图函数: 返回的是 Response 对象, 包括但不限于状态码 (status_code), 返回类型(Content-type) 等
二, flask 结构化拆分.
当我们有大量的业务代码的时候, 就不能在一个 index.py 中书写了, 因为这样臃肿且不易维护, 而且都把代码放在一个文件中也不符合 python 之禅的精神, 所以呢, 我们需要对结构化进行一个拆分.
一般情况下会拆分成以下结构:
test 工程目录
- App #应用层
- config #配置目录
- __init__.py #初始化文件
- secure.py #机密配置
- setting.py #普通配置
- libs #库目录
- helper.py #帮助方法模块
- httper.py #网络请求模块
- ... #其他模块
- models #模型目录
- __init__.py #初始化文件
- model.py #模型文件
- ... #其他文件
- web #蓝图 1 目录
- __init__.py #蓝图初始化文件
- xxx.py #蓝图文件
- ... #其他文件
- API #蓝图 2 目录
- __init__.py #蓝图初始化文件
- xxx.py #蓝图文件
- ... #其他文件
- cms #蓝图 3 目录
- __init__.py #蓝图初始化文件
- xxx.py #蓝图文件
- ... #其他文件
- static #静态文件夹
- CSS #CSS 文件夹
- JS #JS 文件夹
- img #图片
- font #字体
- ... #其他模块
- templates #模版文件夹
- xxxx #业务目录 1
- xxxx.html #业务模版
server.py 入口文件
那么我们现在开始进行结构化拆分之旅吧
1. 增加 config.py
2. 在 server.py 中引入 config 配置文件
启动之后, debug 调试模式开启, 端口号由默认的 5000 更改成 8000 了. 这也就是说我们导入的配置文件有效.
3. 在工程目录下创建一个 user.py 文件
重新启动后, 调用浏览器 http://127.0.0.1:8000/user
为什么会报 404 Not Found 呢? 是不是我们没有在 server 文件中引入 user.py 呢? 那我们在 sever.py 中引入 user.py
浏览器访问 http://127.0.0.1:8000/user
既然我在主文件中已经导入了 user 模块, 那为什么还是不奏效呢? 这个就得从循环导入问题解决了, 你觉得两次的 App 是一样的吗? 我们做一个实验.
在 server.py 中 打印 App 的 id, print('实例化的 app',id(App))
在 server.py 中 main 函数中打印 print('运行中的 app',id(App))
在 user.py 中 打印 print('路由中的 app',id(App))
运行之后:
事实说明 flask 实例化两次, 走路由的那次 App 最终没有在 main 函数中执行, 所以会报 404 错误.
来源: http://www.bubuko.com/infodetail-2963683.html