带有动态'辅助'的Flask-Nav;导航栏

时间:2015-12-28 05:10:31

标签: python flask

Flask-Nav 允许dynamic construction;但是,我无法弄清楚如何通过将字典或列表传递给构建Navbar的函数来实现这一目的。

@nav.navigation
def top_nav():
    # ...

根据文档,每次需要Navbar时都会调用它;但是,您可以执行类似top_nav(items)或类似的操作。

在我的Jinja2模板中,我创建了一个包含该页面子菜单的字典(我想将其作为侧边菜单以及顶部固定导航栏)。我知道它可以用宏的方式完成但我很好奇是否有办法使用Flask-Nav创建带有动态传递项的辅助Navbar。

2 个答案:

答案 0 :(得分:2)

嗯,对于这个问题,我真的很晚了,但是我希望这可以帮助路过的人们。我不完全了解您要如何继续(一些代码会有所帮助),但是字典只是可以解析的项目的集合,可以使用我将要描述的方法添加到导航栏中。这些是我用来为项目中的旁边菜单创建动态导航栏的步骤(导航栏元素由各个模块添加):

  1. 创建导航栏:contextbar = Navbar('Context menu')(当然,需要扩展名flask-nav
  2. 将元素注册到导航栏:nav.register_element('contextbar', contextbar)
  3. create_app()函数中的初始化应用程序(这是标准的Flask工厂构造):nav.init_app(app)
  4. 对于我创建的每个程序包/模块,我将以下内容添加到__init__.py文件中(“ application”当然是我的应用程序的名称):

    from flask import current_app as app
    from flask_nav.elements import View
    from application import contextbar 
    
  5. 最后,仍然放在模块的__init__.py文件中,我使用@app.before_first_request装饰器来确保只添加一次导航栏添加(而不是每个 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'))
    

这样,每个模块都可以添加自己的菜单项(即使不要求该特定模块的路由)。为了完整起见,在jinja2模板中,您只需要在要导航栏呈现的位置添加代码{{nav.contextbar.render()}}

我必须承认我对Python,Flask和朋友还很陌生,但这是我在我的(测试/教程/示例)项目中所做的,并且运行良好。

更新

我在登录/注销时遇到了一些问题,因为在登录之前,该用户未通过身份验证,并且导航栏将显示“ login”,但是此后导航栏不会更改(before_each_request不会触发再次针对相同的“会话”),这不好。因此,我稍加注意就切换到before_request

  1. 与以前一样
  2. 与以前一样
  3. 与以前一样
  4. 与以前一样
  5. 在主应用程序的routes.py中,添加以下代码以初始化导航栏并从“无项目”开始

    @app.before_request
    def before_request():
        # Only perform adding items to contextbar for non-static GET requests
        if request.method == 'GET' and request.endpoint not in ('static',):
            # Reset bar's items to avoid duplicates after each request
            contextbar.items = []
    
            # Add first link to the top bar
            contextbar.items.append(View('Home', 'homepage'))
    
  6. 在模块的每个__init__.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'))
    

答案 1 :(得分:0)

我是这样的

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'  )
        )

因此,如果用户已登录,我会显示更多项目