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 中的动态导航 的相关文章

  • 如何计算 pandas datetime 对象的均值和方差?

    如何计算 YYYY MM DD 形式的 python 日期时间对象的汇总统计数据 均值和标准差 我想对具有不同 ID 的不同日期时间对象组执行此操作 数据如下 import datetime as dt df pd DataFrame Da
  • 如何传递架构以从现有数据帧创建新数据帧?

    要将 schema 传递到 json 文件 我们这样做 from pyspark sql types import StructField StringType StructType IntegerType data schema Stru
  • Pandas set_levels,如何避免标签排序?

    我使用时遇到问题set levels多索引 from io import StringIO txt Name Height Age Metres A 1 25 B 95 1 df pd read csv StringIO txt heade
  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • 计算另一个字符串中多个字符串的出现次数

    在 Python 2 7 中 给定以下字符串 Spot是一只棕色的狗 斑点有棕色的头发 斑点的头发是棕色的 查找字符串中 Spot brown 和 hair 总数的最佳方法是什么 在示例中 它将返回 8 我正在寻找类似的东西string c
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • 更好地相当于这个疯狂的嵌套 python for 循环

    for a in map for b in map a for c in map b for d in map c for e in map d print a b c d e 上面的代码用于创建图中一定长度的所有路径 map a 表示从
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS
  • 如何在Python脚本中从youtube-dl中提取文件大小?

    我是 python 编程新手 我想在下载之前提取视频 音频大小 任何 YouTube 视频 gt gt gt from youtube dl import YoutubeDL gt gt gt url https www youtube c

随机推荐

  • 使用 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 数据库提供支持 每个页面都作为页表中的一行存储 其中包含路径 标题 内容等内容 该结构是分层的 其中页面可以有父级 例如 虽然 关于 可能是一个页面 但也可能有 关于