将SQLAlchemy查询传递给Base Jinja模板

时间:2014-04-14 18:07:23

标签: 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')
@login_required
def dashboard():
    return render_template('templates/dashboard.html', pendingUsers=g.user.company.users.filter(User.account_approved == False).all())

但是,这只允许base.html视图在加载/dashboard路由时获得此信息,如果我加载使用相同base.html文件的任何其他路由,则运行{ {1}}输出不是文字。如何在使用{{ pendingUsers}}的每个路径中渲染该查询?我尝试直接在jinja模板中进行查询,但我无法弄清楚如何做到这一点(例如,运行base.html只是输出SQLAlchemy语句的SQL查询。

1 个答案:

答案 0 :(得分:2)

当你在render_template中调用它时,你正在做什么是不行的,因为你的查询没有被评估。相反,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_users

 {{ g.pending_users }}