Accessing Flask Session variables from Flask Navigation for dynamic navigation menu

回眸只為那壹抹淺笑 提交于 2019-12-01 08:58:04

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.

Flask-Login will make your life easier. It provided a current_user to point to the current user, and the user object has an is_authenticated property:

from flask_login import current_user
...
@nav.navigation()
def top_nav():
    ...
    if current_user.is_authenticated: 
        items.append(View("Logout", ".logout")) 
    else: 
        items.append(View("Login", ".login"))

The code to initialize Flask-Login will like this:

from flask import Flask
from flask_login import LoginManager, UserMixin

app = Flask(__name__)
login_manager = LoginManager(app)

# The user model
class User(db.Model, UserMixin):
    ...


@login_manager.user_loader
def load_user(user_id):
    return User.get(user_id)

Check the documentation for more detail.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!