从 Flask Navigation 访问 Flask Session 变量以实现动态导航菜单

2023-11-30

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

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

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 会话变量超出了 nav 对象的范围,因此我无法从 top_nav 中访问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'),
]

设置一个函数以根据会话中的值返回适当的视图/链接

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:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Flask Navigation 访问 Flask Session 变量以实现动态导航菜单 的相关文章

  • angularjs无法找到模板目录,flask作为后端

    我使用 Flask 作为后端 在客户端使用 angularjs 我的目录结构 dew gt app py gt templates gt hello html gt test html gt static gt js gt directiv
  • 如何让 Angular-Flask 应用加载 html 部分?

    我试图让我的 Angular Flask 应用程序在基本 html 文件中渲染部分 HTML 文件 应用程序加载基本 html 窗口标题和页脚加载 但 ng view 没有加载任何内容 也许我到局部的角度路由不正确 文件结构 gt flas
  • Heroku 上的 OpenCV 错误,但模型部署成功

    我正在尝试在 Heroku 上部署深度学习 Flask 应用程序 它已成功部署 但仍然给我Application Error信息 我检查了日志 但没有发现任何内容 帮我 构建日志 gt Building on the Heroku 20 s
  • Flask 应用程序路由中的多个参数

    烧瓶怎么写app route如果我在 URL 调用中有多个参数 这是我从 AJax 调用的 URL http 0 0 0 0 8888 createcm summary VVV change Feauure 我试图写我的烧瓶app rout
  • 如何在连接到 Heroku PostgreSQL 的 Flask 应用程序上处理更多并发用户?

    Heroku 上的 Flask API 有许多端点 它们在将 json 化结果返回给客户端之前在我的 Heroku PostgreSQL 数据库上运行查询 我当前的计划是 Hobby Basic 层 因此数据库最多只能处理 20 个连接 如
  • 在会话 cookie 中存储大量数据会产生什么影响?

    谁能解释一下在会话中存储大量数据的缺点或给我指出一些阅读材料 我也很感兴趣在会话中存储数据和从数据文件读取数据之间是否有任何区别 如果您在会话中存储大量数据 则输入 输出性能会下降 因为会有大量读取 写入 默认情况下 PHP 中的会话存储在
  • session_regenerate_id 没有创建新的会话 id

    我有一个脚本 旨在完成当前会话并开始新的会话 我使用了一段代码 它在我的开发计算机上运行良好 但是 当我将其发布到生产服务器时 会话 ID 始终保持不变 以下是我重新启动会话的代码 session start SESSION array P
  • 如何处理 AJAX 请求中的会话超时

    我相信你们都熟悉使用 AJAX 的投票系统 嗯 看那边 我有类似的东西 当你投票赞成或反对时 它使用 AJAX 从 votes php 请求新值 问题是我正在使用会话来获取用户 ID 因此一个人只能投票一次 如果他们在页面上坐了一个小时然后
  • 如何在flask中重新加载python模块?

    我有一个名为mapping py有一本字典methodMapping 在我的 Web 应用程序中 一个键值对被添加到 methodMapping 字典中 我将其附加到之后mapping py reload mapping 被调用 并且文件重
  • Spring Boot,Websockets无法从Session获取用户(即java.security.Principal)

    与 一起工作Spring Boot 1 2 1 RELEASE and Spring Websockets 运行嵌入式时存在部署运行时问题Jetty 9 我不能伪造用户 java security Principal 当应用程序部署在本地主
  • 如何配置 Flask-Cache 无限超时

    在 Flask Cache 文档中 所有示例都使用有限超时 我不想在应用程序运行时刷新缓存 这可能吗 如果可以 我该怎么做 Flask Cache 使用werkzeug contrib cache在幕后 来自文档 http werkzeug
  • 将 window.location 传递给 Flask url_for

    我正在使用 python 在我的页面上 当匿名用户转到登录页面时 我想将一个变量传递到后端 以便它指示用户来自哪里 发送 URL 因此 当用户单击此锚链接时 a href Sign in a 我想发送用户当前所在页面的当前 URL
  • hibernate sessionfactory如何管理session?

    我刚刚得到了Hibernate Session和Connection之间的关系 但现在 我又遇到了一个问题 hibernate sessionfactory如何管理session 在以下代码段中 DAO 类的 save 方法 Session
  • Node + Express 会话过期?

    我有一个 Express 应用程序 并且有一个登录表单 我需要持续 1 个月的会话 我是否将 maxAge 设置为一个月 以毫秒为单位 我让两台计算机保持打开状态并登录了 24 小时 当我回来时 两台计算机都已注销 我该如何解决这个问题 实
  • Flask-security 创建角色、用户并将 user_id 链接到 role_id

    我将 Flask Security 与 SQLAlchemy 一起使用 当想要添加用户或角色时 def addrole form addroll createRole user datastore create role name form
  • SocketIO + Flask 检测断开连接

    我在这里有一个不同的问题 但意识到它可以简化为 如何检测客户端何时从页面断开连接 关闭其页面或单击链接 换句话说 套接字连接关闭 我想制作一个带有更新用户列表的聊天应用程序 并且我在 Python 上使用 Flask 当用户连接时 浏览器发
  • Hibernate Session 刷新行为 [ 和 Spring @Transactional ]

    我在网络应用程序中使用 Spring 和 Hibernate SessionFactory被注入到DAO bean中 然后通过webservicecontext在Servlet中使用该DAO DAO 方法是事务性的 在我使用的方法之一内 g
  • 为什么应该或不应该将数据集、数据表等存储为 ASP.NET 页面中的会话变量?

    我正在开发一个使用 Web 服务返回的数据集的 Web 应用程序 当应用程序运行时 我将该数据集存储为会话变量 以便在用户导航到将编辑数据集中的表的不同页面时反复使用 这个想法是 当应用程序加载时 用户只需要等待一次数据 然后应用程序将使用
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • 修复类以在 Flask 会话中启用对象存储[重复]

    这个问题在这里已经有答案了 我有一个自定义类 Passport 其中包含活动用户身份和权限 我曾经将它存储在会话中 如下所示 p Passport p do something fancy session passport p 它就奏效了

随机推荐

  • 如何从回历日期转换为公历日期,反之亦然

    我正在寻找一种方法来计算例如从现在到特定日期有多少天 并且我可以用它来确定我是否处于特定时间段 例如 Muharram 5 天 我已经找了 10 多个小时了 我发现的最好的东西是 HijrahDate 库 java time chrono
  • 更新 conda 后如何从终端提示符中删除 (base)

    更新 miniconda3 后 每当我打开终端时 它都会在我的用户名和主机前面显示 base 在这个回答帖子里https askubuntu com a 1113206 315699建议使用 conda config set changep
  • 在 Python 中格式化驱动器

    我正在尝试制作一个 Python 3 3 程序来格式化 Windows 中的驱动器 例如 SD 卡或 USB 记忆棒 我在这里尝试了代码 http bytes com topic python answers 537724 formatti
  • 从 Silverlight 4 调用 HTTPS-WCF 服务时出现安全错误

    我创建了一个简单的 WCF 服务 我希望可以通过 https 访问它 WCF 服务使用 UserNamePasswordValidator customBinding 和 UserNameOverTransport 作为身份验证模式 我在
  • IPython模块

    我有一些具有冗余功能的 IPython 脚本 我想将常见功能重构为一个模块 并将该模块包含在现有脚本中 问题是它不能成为 python 模块 因为代码使用 Ipython 的语言扩展 等 是否可以制作一个具有 IPython 代码的模块并将
  • 如何使用 django-mptt 创建嵌套评论系统

    我正在开发一个简单的博客 并尝试为每个帖子实现一个嵌套评论系统 我创建了评论模型 它通过 Django 管理页面运行良好 我不知道如何创建用于发布新评论和回复的表单 这是我到目前为止所拥有的 模型 py class Post models
  • Flutter Firebase.signInWithGoogle 方法未找到

    我正在尝试在我的 Flutter 应用程序中添加 Google 身份验证 但是我的Android studio找不到该方法登录Google under Firebase身份验证班级 我的意思是说当我写 FirebaseAuth 时 登录Go
  • ASP.NET Core JWT 和声明

    我对 ASP NET Core 和声明中的 JWT 身份验证有疑问 因为我不知道我是否正确理解了所有内容 当我在 ASP NET 中创建 JWT 令牌时 我添加了一些声明 其中一些可以自定义 当带有 JWT 令牌的请求从客户端发送到 API
  • 如何调整位图大小

    determine padding for scanlines int padding 4 bi biWidth sizeof RGBTRIPLE 4 4 iterate over infile s scanlines for int i
  • 通过地址访问 C 中的位域

    不允许使用其地址访问 C 中的位字段背后的原因是什么 是否因为它可能不是未系统字对齐的地址 或者因为获取字节内的位地址没有意义 因为这种类型的指针算术会很尴尬 位没有地址 这就是为什么你不能通过地址引用它们 寻址的粒度是char 我猜原因是
  • 可以在 MySQL 查询中拆分/分解字段吗?

    我必须创建一份关于一些学生完成情况的报告 每个学生都属于一个客户 这是表格 针对这个问题进行了简化 CREATE TABLE clients clientId int 10 unsigned NOT NULL auto increment
  • 寻找两个三位数乘积的最大回文数问题

    所以在欧拉计划中问题4陈述如下 回文数读起来是一样的 双向 制作的最大回文数 两个 2 位数字的乘积 数字是 9009 91 99 找到最大的回文 两个 3 位数字的乘积 我已经尝试过以下方法 include
  • 将which(,arr.ind=T)反馈回R矩阵的最佳方法?

    我提取了一些我想查看的元素的数组索引 如下所示 mat matrix 0 10 10 arrInd which mat 0 arr ind T 然后我对该矩阵进行更多操作 最终得到一个向量或行rowInd和一个列向量colInd 我希望我们
  • CSS 无法识别带有数值的 HTML ID

    这是 div div class something 我在页面上找到了其中的 9 个 位置不同 所以在 css我做的文件 div 1 something code 问题是它不起作用 我知道这是正确的选择器 但我也尝试过div somethi
  • Swift - 如何将单例设置为零

    我正在用 swift 编写一个应用程序 并使用单例在整个应用程序中共享类对象 User 我希望能够在用户注销时将此单例设置为 nil 以便当他们重新登录时旧属性不再存在 即名称 用户名等 我希望有一种简单的方法可以将单例设置回零 而不必将每
  • 如何确定行的高度?

    具体来说 我想知道 在下面的示例中 为什么要设置height第一个弹性项目的值会更改 实际上增加 第一行的高度 一般来说 我希望能够确定行的高度 我想当弹性容器的高度设置为auto或明确的值 flex container display f
  • 从 C++ 代码运行可执行 jar

    我需要执行一个jar来自某些 C 代码内部的文件 我尝试了以下命令 int ret execlp java java jar myprog jar char 0 它工作正常 但我的问题是我的 c 主线程在执行 jar 文件后停止 我不想在执
  • sqlite,地理坐标索引?

    我有一个包含地理数据的 SQLite 数据库 我的表定义如下 CREATE TABLE GEO OBJECTS ID VARCHAR 30 PRIMARY KEY NOT NULL LATITUDE NUMERIC 6 3 NOT NULL
  • iOS 中平移和滑动有什么区别?

    听起来很简单 按住触控板 移动手指 松开 但不知何故 滑动没有被触发 而是触发平移 UISwipeGestureRecognizer swipeGesture UISwipeGestureRecognizer alloc initWithT
  • 从 Flask Navigation 访问 Flask Session 变量以实现动态导航菜单

    我想要一个动态导航菜单 如果用户当前未登录 则显示 登录 如果用户已登录 则显示 注销 我正在使用类似于以下的代码 import flask import flask nav import flask nav elements as fne