# 3.1 应用、蓝图与视图函数

## 1.Flask的层级关系

![image.png](https://upload-images.jianshu.io/upload_images/7220971-51263cba190cc983.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)

* Flask最上层是app核心对象
* 在这个核心对象上可以插入很多蓝图，这个蓝图是不能单独存在的，必须将app作为插板插入app
* 在每一个蓝图上，可以注册很多静态文件，视图函数，模板
* 一个业务模块可以做为一个蓝图，比如book，user。可以把视图函数注册到蓝图上再插入app。以此来达到之前分文件的目的
* 之前的book.py 放到了app/web/路径下，就是考虑到了蓝图。app属于是整个Flask应用层。web属于是蓝图

## 2.代码规范化

应该讲一些初始化工作，放在对应层级的包的初始化文件 `__init__.py` 中。比如Flask核心应用app对象初始化应该放在应用层级app包的 `__init__.py` 中。蓝图的初始化，应该放在对应蓝图层级web包的`__init__.py`中，并且所有蓝图对应的试图函数都应该放在web目录下

![image.png](https://upload-images.jianshu.io/upload_images/7220971-bdcbd39d58970373.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)

```python
# app/__init__.py

from flask import Flask

def create_app():
    app = Flask(__name__)

    app.config.from_object("config")
    return app
```

修改后的fisher.py

```
from app import create_app


app = create_app()

if __name__ == "__main__":
    print("id为" + str(id(app)) + "的app启动")
    app.run(host=app.config["HOST"], debug=app.config["DEBUG"], port=app.config["PORT"])
```
