预处理函数在app和蓝图级别的不同使用

app级别

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# SQLAlchemy 类实例对象的创建一定要在引用蓝图之前,因为db会在各个蓝图中调用进行数据库操作
db = SQLAlchemy()
from sansa.views.account import account
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand


def create_app():
    """
    创建app
    :return:
    """
    app = Flask(__name__)
    app.config.from_object("settings.Development")
    # 注册到当前app下的蓝图都要执行预处理函数b1
    """
        解释:
            普通方式写预处理函数形式:
                @app对象/蓝图对象.before_request
                def xxx():
                    pass
                
                @app对象/蓝图对象.before_request 执行的本质就是:
                pp对象/蓝图对象.before_request(xxx),即加括号执行  pp对象/蓝图对象.before_request 函数,并将装饰器下方函数的内存地址作为参数传入,
                内部将传入的被装饰函数的内存地址添加至 预处理函数列表中。请求到来之后,执行上下文流程,在执行视图函数之前循环预处理函数列表并执行
                每一个预处理函数。
                通过上面的分析我们还可以发现,app调用了before_request就会将被装饰函数添加至app的预处理函数中,蓝图对象调用了before_request就会将
                被装饰函数添加至视图的预处理函数中 
    """
    app.before_request(b1)
    # 初始化db,读取app中关于数据库连接的配置信息,一定要放在导入配置之后
    db.init_app(app)
    app.register_blueprint(account)
    # 创建项目管理器
    manager = Manager(app)
    # 创建数据库迁移管理实例
    migrate = Migrate(app,db)
    # 为管理器添加一个db的命令
    manager.add_command("db",MigrateCommand)
    return manager


def b1():
    print("app级别的预处理函数")

蓝图级别

from flask import Blueprint
from sansa import db
from sansa.models import Users
account = Blueprint("account",__name__)

@account.before_request
def b2():
    print("我是蓝图级别的预处理函数")


@account.route('/login',methods=["GET"])
def login():
    db.session.add(Users(name='王超'))
    db.session.commit()
    # 释放当前会话的连接
    db.session.remove()
    return "Login"

 

posted on 2018-10-12 23:41  云烟||成雨  阅读(375)  评论(0编辑  收藏  举报