且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

从Flask导航访问Flask会话变量以获取动态导航菜单

更新时间:2023-09-29 08:23:58

flask_nav registers extensions at a stage in the application lifecycle before requests start to be processed.

You can overwrite the registration of the template_global to later when a request context exists in the application.

Factor out common navigation items.

nav = Nav()

# registers the "top" menubar
navitems = [
    View('Widgits, Inc.', 'index'),
    View('Our Mission', 'about'),
]

Set a function to return an appropriate View/Link based on value in session

def with_user_session_action(items):
    return (
        items 
        + [ View('Login', 'login') if not session.get('logged') else View('Logout', 'logout')]
    )

Use this in a function that delegates to nav.register_element

def register_element(nav, navitems):
    navitems = with_user_session_action(navitems)
    return nav.register_element('top', 
        Navbar(*navitems)
    )

Supersede render_template to always pass down the computed navigation

_render_template = render_template

def render_template(*args, **kwargs):
    register_element(nav, navitems)

    return _render_template(*args, nav=nav.elems, **kwargs)

Bonus:

You can cache the computed nav for login/logout so that it isn't only computed once for each case.

相关阅读

推荐文章