Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带动态'的烧瓶导航;中学';导航栏_Python_Flask_Flask Nav - Fatal编程技术网

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'))
    
  • 这样,每个模块都可以添加自己的菜单项(即使未请求该特定模块的路径)。为了完整性起见,在jinja2模板中,您只需要将代码
    {{{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'  )
            )