将SQLAlchemy查询传递给基本Jinja模板

将SQLAlchemy查询传递给基本Jinja模板,sqlalchemy,flask,jinja2,flask-sqlalchemy,python-decorators,Sqlalchemy,Flask,Jinja2,Flask Sqlalchemy,Python Decorators,我正在使用Flask、SQLAlchemy和Jinja创建一个应用程序。我的应用程序中几乎每个页面都使用base.html文件(本质上是一个带有导航栏和边栏的shell),然后在此基础上构建。我在base.html文件中显示SQLAlchemy查询结果的信息: user.company.users.filter(User.account_approved == False).all() 现在,我使用以下命令将其传递到单个视图: @splash.route('/dashboard') @logi

我正在使用Flask、SQLAlchemy和Jinja创建一个应用程序。我的应用程序中几乎每个页面都使用
base.html
文件(本质上是一个带有导航栏和边栏的shell),然后在此基础上构建。我在
base.html
文件中显示SQLAlchemy查询结果的信息:

user.company.users.filter(User.account_approved == False).all()
现在,我使用以下命令将其传递到单个视图:

@splash.route('/dashboard')
@login_required
def dashboard():
    return render_template('templates/dashboard.html', pendingUsers=g.user.company.users.filter(User.account_approved == False).all())

但是,这只允许在我加载
/dashboard
路由时
base.html
视图具有此信息,并且如果我加载使用相同
base.html
文件的任何其他路由,运行
{{pendinguers}
不会输出文本。如何在使用
base.html
的每个路由中呈现该查询?我尝试直接在jinja模板中进行查询,但我不知道如何进行(例如,运行
{{g.user.company.users}}
只是输出了该SQLAlchemy语句的SQL查询。

您所做的工作不会起作用,因为在render_模板中调用查询时不会对其求值。相反,SQL查询字符串会按原样发送到模板

您可以使用自定义装饰器,因为您只希望对某些视图/页面执行此操作

def get_pending_users(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        pending_users = user.company.users.filter(User.account_approved == False).all()
        if g.pending_users is None:
           g.pending_users = pending_users
        return f(*args, **kwargs)
    return decorated_function
在您看来,您可以将其称为:

@app.route('/',methods = ['GET','POST])
@get_pending_users
def whatever():
    return render_template('templates/dashboard.html')
然后,在模板中,只需调用
g.pending_用户

 {{ g.pending_users }}

不过,我只想对某些页面(使用
base.html
的页面)运行此功能。我如何将其变成一个自定义的装饰程序,以便在这些页面之前调用?但您在问题中说“我的应用程序中的每个页面都使用base.html…”。所以我假设每个模板都会扩展base.html,不是吗?很抱歉,我说错了,只是修改了这个问题。应用程序中几乎每个页面都使用它,但有些页面不使用。这个方法仍然可用吗?