Python 带动态'的烧瓶导航;中学';导航栏
允许;但是,我无法通过将字典或列表传递给函数来构建导航栏来了解如何做到这一点Python 带动态'的烧瓶导航;中学';导航栏,python,flask,flask-nav,Python,Flask,Flask Nav,允许;但是,我无法通过将字典或列表传递给函数来构建导航栏来了解如何做到这一点 @nav.navigation def top_nav(): # ... 根据文档,每次需要Navbar时都会调用它;但是,您可以执行类似top_nav(项目)或类似的操作 在我的Jinja2模板中,我为该页面创建了一个带有子菜单的字典(我想将其与顶部固定导航栏一起作为侧菜单)。我知道这可以通过宏来实现,但我很好奇是否有办法使用Flask Nav创建带有动态传递项的辅助Navbar 这个问题我真的来不及回答了
@nav.navigation
def top_nav():
# ...
根据文档,每次需要Navbar时都会调用它;但是,您可以执行类似top_nav(项目)或类似的操作
在我的Jinja2模板中,我为该页面创建了一个带有子菜单的字典(我想将其与顶部固定导航栏一起作为侧菜单)。我知道这可以通过宏来实现,但我很好奇是否有办法使用Flask Nav创建带有动态传递项的辅助Navbar 这个问题我真的来不及回答了,但我希望这能帮助路过的人。我不完全理解您想要如何继续(一点代码可能会有帮助),但字典只是一个项目集合,您可以使用我将要描述的方法解析并添加到导航栏。以下是我用来为项目中的旁白菜单创建动态导航栏的步骤(导航栏元素由各个模块添加):
contextbar=navbar(“上下文菜单”)
(当然,这需要flask-nav
扩展名)nav.Register\u元素('contextbar',contextbar)
create_app()
函数中的Init app(它是标准的烧瓶工厂构造):nav.Init_app(app)
\uuuu init\uuuuu.py
文件(“应用程序”当然是我的应用程序的名称):
\uuu init\uuuuuuuuuuupy
文件中,我使用@app.before\u first\u request
装饰程序确保仅添加一次导航栏(而不是每次请求),以避免重复项,代码如下
# Add elements to the contextual navigation bar
@app.before_first_request
def before_first_request():
contextbar.items.append(View('Meow', 'path.to.blueprint.meow'))
contextbar.items.append(View('Bark', 'path.to.blueprint.bark'))
{{{nav.contextbar.render()}}
添加到希望navbar呈现的位置
我必须承认,我对Python、Flask和朋友都是相当陌生的,但这就是我在(测试/教程/示例)项目中所做的,并且它工作得很好
更新
我在登录/注销时遇到了一些问题,因为在登录之前,用户没有经过身份验证,导航栏将显示“登录”,但在登录之后导航栏不会更改(每个请求之前的不会为同一个“会话”再次触发),这是不好的。因此,我在请求之前切换到了,
,并略带警告:
和以前一样
和以前一样
和以前一样
和以前一样
在我的主应用程序的routes.py
中,我添加了以下代码来初始化导航栏并从“无项目”开始
在模块的每个\uuuuu init\uuuuuuuu.py
文件中,我从点“5”添加了相同的代码,但没有重置导航条项目:
@app.before_request
def before_request():
# Only perform adding items to contextbar for non-static GET requests (POST requests usually do not need nav bars)
if request.method == 'GET' and request.endpoint not in ('static',):
# This is added to make sure these links are added only if the user is logged in
if current_user.is_authenticated:
contextbar.items.append(View('Bark', 'path.to.blueprint.bark'))
# This link will be added to the navbar for logged in and out users
contextbar.items.append(View('Meow', 'path.to.blueprint.meow'))
我是这样做的
from flask_nav import Nav
from flask_nav.elements import Navbar, View
from flask_login import current_user
nav = Nav()
@nav.navigation()
def mynavbar():
if current_user.is_authenticated:
return Navbar(
'Title',
View('Home', 'index' ),
View('Servizi', 'servizi' ),
View('Logout', 'logout' )
)
else:
return Navbar(
'Title',
View('Home', 'index' ),
View('Login', 'login' )
)
因此,如果用户已登录,我将显示更多项目
@app.before_request
def before_request():
# Only perform adding items to contextbar for non-static GET requests (POST requests usually do not need nav bars)
if request.method == 'GET' and request.endpoint not in ('static',):
# This is added to make sure these links are added only if the user is logged in
if current_user.is_authenticated:
contextbar.items.append(View('Bark', 'path.to.blueprint.bark'))
# This link will be added to the navbar for logged in and out users
contextbar.items.append(View('Meow', 'path.to.blueprint.meow'))
from flask_nav import Nav
from flask_nav.elements import Navbar, View
from flask_login import current_user
nav = Nav()
@nav.navigation()
def mynavbar():
if current_user.is_authenticated:
return Navbar(
'Title',
View('Home', 'index' ),
View('Servizi', 'servizi' ),
View('Logout', 'logout' )
)
else:
return Navbar(
'Title',
View('Home', 'index' ),
View('Login', 'login' )
)