将SQLAlchemy查询传递给基本Jinja模板
我正在使用Flask、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
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,不是吗?很抱歉,我说错了,只是修改了这个问题。应用程序中几乎每个页面都使用它,但有些页面不使用。这个方法仍然可用吗?