gpt4 book ai didi

session - 从 Flask Navigation 访问 Flask Session 变量以获取动态导航菜单

转载 作者:行者123 更新时间:2023-12-03 16:02:32 25 4
gpt4 key购买 nike

我想要一个动态导航菜单,如果用户当前未登录则显示“登录”,如果用户已登录则显示“注销”。

我正在使用类似于以下的代码:

import flask
import flask_nav
import flask_nav.elements as fne

frontend = flask.Blueprint('frontend', __name__)

application = flask.Flask(__name__)
mySess = flask_session.Session()

flask_appconfig.AppConfig(application)
flask_bootstrap.Bootstrap(application)
application.register_blueprint(frontend)
application.config['BOOTSTRAP_SERVE_LOCAL'] = True
application.config['SSL'] = True
application.secret_key = SECRET_KEY
application.config['SESSION_TYPE'] = SESSION_TYPE

mySess.init_app(application)

nav = flask_nav.Nav()

class CustomRenderer(flask_bootstrap.nav.BootstrapRenderer):
def visit_Navbar(self, node):
nav_tag = super(CustomRenderer, self).visit_Navbar(node)
nav_tag['class'] = 'navbar navbar-default navbar-fixed-top'
return nav_tag

flask_nav.register_renderer(application, 'custom', CustomRenderer)

nav.init_app(application)

@nav.navigation()
def top_nav():
items = [ fne.View('Home', '.index') ]

if 'google_token' in flask.session:
items.append(fne.View('Logout', '.logout'))
elif 'auth_url' in flask.session:
items.append(fne.View('Login', flask.session['auth_url']))
else:
items.append(fne.View('Login', '.login'))

items.append(fne.View('About', '.about'))
items.append(fne.View('Contact', '.contact'))
items.append(fne.View('Shop', '.shop'))
items.append(fne.View('Help & Feedback', '.help'))

return fne.Navbar('', *items)

nav.register_element('frontend_top', top_nav())

不幸的是,Flask session 变量超出了 nav 对象的范围,因此我无法从 top_nav 中访问 flask.session。

例如,当我在我的应用程序之外创建任何用于访问 flask-session 的独立函数时,我遇到了同样的困难

def user_is_logged_in():
if 'google_token' in flask.session:
return True
else:
return False
return False

这些函数给出了预期的错误“RuntimeError:在请求上下文之外工作。”

出于安全原因,我不想在我的 application.py 代码中为用户使用全局变量,这样多人可以同时访问该应用程序而不会出错。我相信 SESSION 应该存储用户当前是否登录。

如何让我的 flask_nav.Nav() 看到我的应用程序的 flask.session?

最佳答案

flask_nav 在开始处理请求之前的应用程序生命周期中的某个阶段注册扩展。

当应用程序中存在请求上下文时,您可以稍后覆盖 template_global 的注册。

分解出常见的导航项。

nav = Nav()

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

设置一个函数以根据 session 中的值返回适当的 View /链接

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

在委托(delegate)给 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)

奖励:

您可以缓存为登录/注销计算的导航,这样它就不会只为每种情况计算一次。

关于session - 从 Flask Navigation 访问 Flask Session 变量以获取动态导航菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45948609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com