Flask 中的动态导航

2024-04-22

我有一个在 Flask 中工作的非常简单的网站,它全部由 sqlite 数据库提供支持。每个页面都作为页表中的一行存储,其中包含路径、标题、内容等内容。

该结构是分层的,其中页面可以有父级。例如,虽然“关于”可能是一个页面,但也可能有“关于/某事”和“关于/蛋糕”。因此,我想创建一个导航栏,其中包含指向具有“/”父级(/ 是根页面)的所有链接的链接。此外,我希望它还显示打开的页面以及该页面的所有父页面。

例如,如果我们位于“about/cakes/muffins”,除了始终显示的链接之外,我们还会以某种方式看到“about/cakes”的链接,如下所示:

- About/
  - Cakes/
    - Muffins
    - Genoise
  - Pies/
- Stuff/
- Contact
- Legal
- Etc.[/]

对于那些有子项的页面,带有尾部斜杠,对于那些没有子项的页面,不带尾部斜杠。

Code:

@app.route('/')
def index():
    page = query_db('select * from page where path = "/"', one=True)
    return render_template('page.html', page=page, bread=[''])

@app.route('/<path>')
def page(path=None):
    page = query_db('select * from page where path = "%s"' % path, one=True)
    bread = Bread(path)
    return render_template('page.html', page=page, crumbs=bread.links)

我已经觉得我因为那里有两个功能而违反了 DRY。但是进行导航会进一步违反它,因为我还希望在错误页面等内容上进行导航。

但我似乎找不到一种特别 Flasky 的方法来做到这一点。有任何想法吗?


“flasky”和 pythonic 方式将使用基于类的视图和模板层次结构

首先阅读两者的文档,然后您可以基于此方法重构您的代码:

class MainPage(MethodView):
    navigation=False
    context={}

    def prepare(self,*args,**kwargs):
        if self.navigation:
            self.context['navigation']={
                #building navigation
                #in your case based on request.args.get('page')
            }
        else:
            self.context['navigation']=None

    def dispatch_request(self, *args, **kwargs):
        self.context=dict() #should nullify context on request, since Views classes objects are shared between requests
        self.prepare(self,*args,**kwargs)
        return super(MainPage,self).dispatch_request(*args,**kwargs)

class PageWithNavigation(MainPage):
    navigation = True

class ContentPage(PageWithNavigation):
    def get(self):
        page={} #here you do your magic to get page data
        self.context['page']=page
        #self.context['bread']=bread
        #self.context['something_Else']=something_Else
        return render_template('page.html',**self.context)

然后你可以执行以下操作: 为 main_page.html 和 page_with_navigation.html 创建单独的页面 然后你的每个页面“error.html、page.html、somethingelse.html”都基于其中之一。 关键是动态地执行此操作:

将稍微修改准备方法:

def prepare(self):
        if self.navigation:
            self.context['navigation']={
                #building navigation
                #in your case based on request.args.get('page')
            }
        else:
            self.context['navigation']=None
        #added another if to point on changes, but you can combine with previous one
        if self.navigation:
            self.context['extends_with']="templates/page_with_navigation.html"
        else:
            self.context['extends_with']="templates/main_page.html"

还有你的模板:main_page.html

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    {% block navigation %}
    {% endblock %}
    {% block main_content %}
    {% endblock %}
</body>
</html>

page_with_navigation.html

{% extends "/templates/main_page.html" %}

{% block navigation %}
        here you build your navigation based on navigation context variable, which already passed in here
{% endblock %}

page.html 或任何其他 some_page.html。把事情简单化!
注意第一行。您的视图设置了哪个页面应该进入其中,您可以通过设置 view-class 的 navigation= 轻松调整它。

{% extends extends_with %}

{% block main_content %}
        So this is your end-game page.
        Yo do not worry here about navigation, all this things must be set in view class and template should not worry about them
        But in case you need them they still available in navigation context variable
{% endblock %}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask 中的动态导航 的相关文章

随机推荐

  • 使用 Folium 在地图上创建标记会导致空白 HTML 页面

    我尝试使用 python3 中的 folium 库创建地图 在我向地图添加标记之前它工作正常 添加标记后 输出结果只是一个空白的 HTML 页面 import folium map folium Map location 20 59 78
  • 如何在R中将文本拆分为两个有意义的单词

    这是我的数据框 df 中的文本 其中有一个名为 problem note text 的文本列 SSCIssue 钞票分配器故障执行检查 分配器故障 要求商店取出钞票分配器并将其放回去 仍然错误消息说前门已打开 因此 CE attn req联
  • PHP mysqli_multi_query 大插入问题

    我尝试了很多方法试图插入从文本文件解析的大量数据 在我的服务器上大约 2 秒内将 200 000 行文本解析到数组中 所以我知道这部分不是问题 我使用的 mysqli multi query 以 5 000 块为单位发送查询 出于某种原因
  • 如何在 SQL-Server 中创建一个只能访问一张表并且只能插入行的用户

    我有一个 SQL Server 数据库 很快就会有两个数据库 我将其用于网站 我已经有一个数据库 1 的只读用户帐户 用于搜索我们的产品库存 我想仅为数据库 2 仅表 1 创建一个单独的帐户 该帐户仅允许插入记录 不允许更新或删除或其他任何
  • 使用 sympy 在特定点评估雅可比行列式

    我试图在 x y 0 0 处评估雅可比行列式 但无法这样做 import sympy as sp from sympy import import numpy as np x y sp symbols x y real True J Fun
  • 如何使用ipad的objective-c发送/接收soap对象

    我一直在尝试为 ipad 编写一个 Objective C 应用程序来发送 接收肥皂网络服务 我已经写了一个代码 但它给出了一个错误 网络服务正在在线运行 这是我的代码 IBAction invokeService txt1 resignF
  • 使用 Calendar.getInstance() 与 new GregorianCalendar() 获取当前日期时间

    使用获取日期时间之间可能有什么区别 Calendar getInstance vs new GregorianCalendar 在源码中寻找日历 getInstance http download oracle com javase 6 d
  • SendKeys 在 Fraps 上不起作用

    对于那些不熟悉 frap 的人 它的屏幕录制程序可以通过快捷键触发 我正在使用 SendKeys SendWait 调用来触发 fraps 我注意到这不会触发 fraps 来录制任何视频 但如果我手动按下该键 fraps 就会被录制 有没有
  • 具有代理设置的 AWS API Gateway 自定义授权方 - 将自定义标头添加到请求

    我拥有的 AWS API 网关设置为代理 proxy 自定义 Auth 函数 用于授权此代理设置的传入请求 自定义身份验证函数正在通过 上下文 对象传递我想要传递给请求的附加信息 如下所示 principalId yyyyyyyy 政策文件
  • symfony2 twig 渲染,抛出异常

    所以在我的基本模板中 我有 render EcsCrmBundle Module checkClock 然后我创建了 ModuleController php
  • NuGet 中的包依赖项解析和命名冲突

    在我的工作团队中 我们依赖两个 NuGet 源 来自 NuGet org 的官方源用于公共包 文件服务器上的文件夹用于内部包 这对我们来说效果很好 但我认为我们有一个潜在的问题 看起来 NuGet 根据包名称和版本号来解析依赖项 由于只有一
  • React hooks 状态没有在日志中更新

    如果我写 function Component const isLoading setLoading useState true const request gt setLoading true console log isLoading
  • 如何将action分派到特定的reducer?

    我有多个减速器 每个减速器都有一个类型 INIT 我想要实现的是 从触发动作的位置来看 只有相关的减速器才能接收该动作 有没有中间件可以做到这一点 您在创建减速器时是否重复使用减速器逻辑 你可以尝试这样的事情 function create
  • 如何应用结构偏移?

    我有一个结构 typedef struct foo int lengthOfArray1 int lengthOfArray2 int array1 int array2 foo 我需要为整个结构及其数组的内容分配足够的内存 所以假设每个数
  • C# Var 与 Target 类型的 new

    C 9 was 正式宣布 https devblogs microsoft com dotnet welcome to c 9 0 几天前 一项新的语言功能是 目标类型的新表达式 它的用法与var 比较以下声明 我很好奇哪个性能更高 如果有
  • Rails 复制了资源中的参数

    我正在使用 Angular 资源 但我不明白为什么 Rails 会重复参数并将其放在资源名称中 我只需要了解为什么会发生这种情况 post data title asdsad rails parameters Parameters titl
  • 如何在 nginx.conf 中引用操作系统环境变量

    在 nginx conf 中 设置变量后set name value 我可以像这样参考它 name 但是当我导出操作系统环境变量时 经过env name from env like https nginx org en docs ngx c
  • 如何查找数字的二进制表示形式中 1 的个数?

    从其他搜索中 我发现这个问题被称为 汉明权重 或 人口计数 这么多的统计数据已经给出了很多答案吗 我需要以简单的方式找到解决方案吗 复杂性并不是什么大问题 JavaScript 中是否有像 Java 的 Integer bitCount 这
  • 如何通过对 R 中的变量进行分组来为折线图着色?

    我制作了一个线图 看起来像这样 我有 50 个国家及其过去 10 年 GDP 的数据集 样本数据 Country variable value China Y2007 3 55218e 12 USA Y2007 1 45000e 13 Ja
  • Flask 中的动态导航

    我有一个在 Flask 中工作的非常简单的网站 它全部由 sqlite 数据库提供支持 每个页面都作为页表中的一行存储 其中包含路径 标题 内容等内容 该结构是分层的 其中页面可以有父级 例如 虽然 关于 可能是一个页面 但也可能有 关于