【Flask】蓝图blueprint是什么?如何用蓝图实现“三生万物”

版权声明:欢迎交流,转载请注明出处。 https://blog.csdn.net/u013034226/article/details/83279675

蓝图是什么?

Flask uses a concept of blueprints for making application components and supporting common patterns within an application or across applications.(Flask使用蓝图的概念来制作应用程序组件,并支持应用程序内或跨应用程序的公共模式。)        ------蓝图

蓝图的基本设想是它们记录注册到一个应用时的操作执行情况,在蓝图被注册到应用之后,所要执行的操作的集合。当分配请求时, Flask 会把蓝图和视图函数关联起来,并生成两个端点之前的 URL 。简单理解蓝图:就是将系统的代码模块化。但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。

运行机制:

1.延迟创建路由映射的类,蓝图不能独立运行,程序实例先创建url_map
2.蓝图给程序实例的url_map容器添加蓝图路由
3.add_url_rule函数给程序添加路由

蓝图的优点:

其本质上来说就是让程序更加松耦合,更加灵活,增加复用性,提高查错效率,降低出错概率。

蓝图的应用场景:


1. 把一个应用分解为一个蓝图的集合。这对大型应用是理想的。一个项目可以实例化一个应用对象,初始化几个扩展,并注册一集合的蓝图。
2. 以 URL 前缀和/或子域名,在应用上注册一个蓝图。 URL 前缀/子域名中的参数即成为这个蓝图下的所有视图函数的共同的视图参数(默认情况下)。
3. 在一个应用中用不同的 URL 规则多次注册一个蓝图。
4. 通过蓝图提供模板过滤器、静态文件、模板和其它功能。一个蓝图不一定要实现应用或者视图函数。
5. 初始化一个 Flask 扩展时,在这些情况中注册一个蓝图。
 

模块化之前:

from flask import Flask


app = Flask(__name__)

# 访问不同的url,会看到不同的内容
@app.route('/')
def index():
    return '道生一'

@app.route('/2')
def list():
    return '一生二'

@app.route('/3')
def detail():
    return '二生三 => 三生万物'

if __name__ == '__main__':
    print(app.url_map)
    app.run(debug=True)

使用蓝图后:

将一个文件拆分为三个,具体思路见下面代码及注释。

①在demo1_yi.py中

from flask import Flask
# 4.导入蓝图中的对象
from  demo1_er import api
app = Flask(__name__)
# 5.在程序实例app上注册蓝图
app.register_blueprint(api)

@app.route('/')
def index():
    return '道生一'

if __name__ == '__main__':
    print(app.url_map)
    app.run(debug=True)

②在demo1_er.py中

# 1.导入蓝图
from flask import Blueprint

# 2.创建蓝图对象,第一个参数表示蓝图的名称,第二个参数文件名,第三个参数,url前缀
api = Blueprint('api', __name__, url_prefix='')

# 虽然“三”中导入了“二”中的蓝图对象api,但是"二"并不知道“三”使用了它
# 所以要把“三”导入到“二”(创建蓝图对象)中。
from demo1_san import detail

# 3.使用蓝图对象
@api.route('/2')
def list():
    return '一生二'

③在demo1_san.py中

# 6.导入二文件中的蓝图对象
from demo1_er import api


@api.route('/3')
def detail():
    return '二生三 => 三生万物'

使用蓝图思路:

1.导入蓝图
2.创建蓝图对象,第一个参数表示蓝图的名称,第二个参数文件名,第三个参数:url前缀
3.使用蓝图对象,在这个蓝图对象上进行操作,注册路由,指定静态文件夹,注册模版过滤器
4.在程序实例上注册蓝图对象

猜你喜欢

转载自blog.csdn.net/u013034226/article/details/83279675