预处理函数在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"
感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下"推荐"按钮,本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接,谢谢。