蓝本

蓝本(blueprint),在概念上类似子程序。借助蓝本,可根据功能模块对程序进行拆分。每个功能模块创建一个蓝本对象,视图函数注册到关联的蓝本对象。每个蓝本可以设定不同的URL前缀,注册错误处理函数,使用不同的模版和静态文件夹等

from flask import Flask, Blueprint

app = Flask(__name__)
main_bp = Blueprint('main', __name__)
auth_bp = Blueprint('auth', __name__)

@main_bp.route('/settings', methods=['GET', 'POST'])
@login_required
def settings():
    ...

@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
    ...

app.register_blueprint(main_bp)
app.register_blueprint(auth_bp)

工厂函数

工厂函数,或程序工厂,即把创建程序的操作封装到一个函数中,可以根据传入参数动态调整配置。
在工厂函数内,先创建程序实例,并在函数内完成初始化扩展、注册蓝本、注册各种处理函数等一系列操作,最后返回可以直接运行的程序实例;其可以接受配置名称作为参数,在内部加载对应的配置文件或配置对象,实现按需创建加载不同配置的程序实例。
按照惯例,工厂函数一般会被命名为create_app或make_app。

from flask import Flask

def create_app(config_name='development'):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    # 注册蓝本
    app.register_blueprint(main_bp)
    app.register_blueprint(auth_bp)
    # 初始化扩展
    db.init_app(app)
    login_manager.init_app(app)
    # 上下文处理函数
    @app.context_processor
    def inject_user():  # 函数名可以随意修改
        user = db.session.execute(select(User)).scalar()
        return dict(user=user)
    # 错误处理函数
    ...
    # 自定义命令函数
    ...
    return app

目录下增加一个—init.py文件,python就会把这个目录作为一个包,而不是普通目录;


参考