flask_nav
在开始处理请求之前,在应用程序生命周期的某个阶段注册扩展。
当应用程序中存在请求上下文时,您可以稍后覆盖 template_global 的注册。
分解出常见的导航项目。
nav = Nav()
# registers the "top" menubar
navitems = [
View('Widgits, Inc.', 'index'),
View('Our Mission', 'about'),
]
设置一个函数以根据会话中的值返回适当的视图/链接
def with_user_session_action(items):
return (
items
+ [ View('Login', 'login') if not session.get('logged') else View('Logout', 'logout')]
)
在委托给 nav.register_element 的函数中使用它
def register_element(nav, navitems):
navitems = with_user_session_action(navitems)
return nav.register_element('top',
Navbar(*navitems)
)
取代 render_template 以始终传递计算的导航
_render_template = render_template
def render_template(*args, **kwargs):
register_element(nav, navitems)
return _render_template(*args, nav=nav.elems, **kwargs)
Bonus:
您可以缓存计算出的登录/注销导航,这样它就不会只为每种情况计算一次。