Flask:蓝图中的模板继承自应用程序中的模板?

2024-03-28

我是 Flask/Jinja2 的新手,所以也许我忽略了一些明显的事情,但是:

Flask 不应该开箱即用地允许蓝图中存在的模板吗?templates/文件夹来扩展由我的应用程序定义的基本模板templates/文件夹?即使蓝图还包含一个“默认”基本模板(我通过定义自己的同名基本模板来覆盖该模板),这难道不应该起作用吗?

答案是这另一个问题 https://stackoverflow.com/q/11233959/1337498让我认为这两件事绝对应该如此。具体来说,答案的一部分说:

如果有两个同名模板,[一个]在应用程序的模板文件夹中,[另一个在]蓝图的模板文件夹中,则应用程序的模板文件夹中的模板将优先。

但对我来说根本不是这样。事实上,它似乎有效opposite方式,即base.html来自蓝图被我的应用程序中定义的页面拉入,即使我的应用程序定义了自己的base.html(如果上述答案正确,则应该“优先”)。

在我的应用程序中我有:

myapp/
   templates/
       base.html
       pages/
           page_base.html
           home_page.html

where pages/home_page延伸pages/page_base,这反过来又延伸base.

我也在使用flask_user来自 PyPI 的软件包,已安装(通过pip) at /usr/local/lib/python2.7/dist-packages/flask_user/。其templates文件夹排列如下:

flask_user/
    templates/
        base.html
        flask_user/
            [templates that extend base.html]

该包使其模板可供通过蓝图使用它的应用程序使用,该蓝图是通过以下调用在init_app其功能UserManager class (__init__.py,第 154 行 https://github.com/lingthio/Flask-User/blob/master/flask_user/__init__.py#L154):

    # Add flask_user/templates directory using a Blueprint                  
    blueprint = Blueprint('flask_user', 'flask_user', template_folder='templates')
    app.register_blueprint(blueprint)

我最初的想法是通过定义我自己的myapp/templates/base.html我可以自定义从模板呈现的页面flask_user/templates/flask_user/看起来像我的应用程序中的其他页面,因为(根据引用的答案)我的base.html应优先于flask_user's base.html.

但这是行不通的,更糟糕​​的是——更令人惊讶的是——my应用程序页面的默认外观为flask_user的页面。

深层发掘...

研究 @Pralhad Narsinh Sonar 的建议,即模板搜索路径的排序可能存在问题,可能是由 的不确定性行为引起的DispatchingJinjaLoader._iter_loaders()正如建议的Fewstreet.com 文章 http://fewstreet.com/2015/01/16/flask-blueprint-templates.html他引用说,我做了一个快速实验,看看是什么顺序_iter_loaders()将为我的应用程序生成:

>>> from myapp.top import app, db
>>> from myapp.startup import init_app.init_app
>>> init_app(app, db)
>>> app.jinja_env.loader
<flask.templating.DispatchingJinjaLoader object at 0x7f233e396dd0>
>>> for loader in app.jinja_env.loader._iter_loaders('pages/home_page.html') :
...   print loader, loader.searchpath
... 
<jinja2.loaders.FileSystemLoader object at 0x7f233eb08490> ['/var/www/python/myapp/templates']
<jinja2.loaders.FileSystemLoader object at 0x7f233e36ef10> ['/usr/local/lib/python2.7/dist-packages/flask_user/templates']

正如预期的那样,迭代器为我的应用程序生成了加载程序templates/ folder first,在让出装载机之前flask_user/templates/。事实上,_iter_loaders()函数的结构经过精心设计,在返回之前返回应用程序的加载程序any蓝图的加载​​程序。 (如果我正确地阅读了 Fewstreet.com 的文章,那么它所关心的问题是multiple蓝图,因为我的应用程序只使用一个蓝图,这不是我当前的问题。)

这个结果让我更难理解为什么flask_user's base.html模板用于解析我的模板{% extends "base.html" %}陈述*。既然我有自己的base.html文件输入myapp/templates,我认为模板系统没有任何理由查看中的任何内容flask_user/templates渲染myapp/templates/pages/home_page.html.

* For testing purposes I got rid of the indirection through pages/page_base.html mentioned above.

So:显然还有其他问题,但是what?

我还没有充分了解相关代码flask/templating.py or jinja2/loaders.py了解为什么以及如何发生这种情况。这是我第一次尝试 Flask,我希望我不需要这么做。


答案是:

一直以来我一直在运行(并重新加载)我的应用程序debug=True.

这对于自动重新加载更改的 Python 模块非常有用。

但对于改变模板?嗯……没那么多。

在我的中引入断点后home_page.html并使用 Flask 调试器回顾一些堆栈帧,我发现 Jinja2 使用 LRU 缓存来存储(按名称)它已经解析的模板。

因为我萌生了创建自己的想法base.html模板after已经加载了flask_user page (login.html),最初继承自flask_user/templates/base.html, 有already一个名为base.html当我介绍时在缓存中myapp/templates/base.html.

So I 停止并重新启动应用程序,现在我的home_page.html and flask_user's login.html正确继承自my base.html而不是来自flask_user's base.html。我怀疑在我重新启动该应用程序之前,我自己的base.html甚至从未去过read通过我的应用程序的模板加载器。

这是一个相当重要的——而且,我相信,无证的——新手必须弄清楚的问题。我将其留在这里,希望有一天它能帮助其他碰巧踏入这个特定陷阱的人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask:蓝图中的模板继承自应用程序中的模板? 的相关文章

随机推荐

  • 如何从exe中找出目标框架名称和版本?

    我有一些使用 net Framework 4 5 或 net core 2 1 或 net core 3 1 创建的 exe 文件 我想仅使用 C 应用程序从此 DLL 获取框架名称和版本信息 我在下面编写了一段代码 该代码非常有用 并且适
  • 使用 Nodejs 和 Express 进行视频流传输

    我正在尝试使用nodejs 和express 将视频流式传输到html5 视频播放器 据我所知 很多人以前都这样做过 但是很少有人使用过express 在我发现的情况下 大多数人说这样做 var express require expres
  • EBCDIC 十六进制字符串的 Python 字节表示

    我有一个十六进制字符串 Hex E388854083969497A4A38599408881A2409985829696A38584408699969440814082A48783888583924B 作为字节对象 它看起来像这样 b xe
  • 如何将 Char 转换为 Int?

    所以我有一个String看起来像的整数 82389235 但我想迭代它以将每个数字单独添加到MutableList 然而 当我按照我认为的方式处理它时 var text 82389235 for num in text numbers ad
  • JavaScript 中的“name”关键字是什么?

    当我输入这段看似无辜的代码片段时 values name gedit 突出显示name作为关键字 然而 name未由链接到的页面列出关于保留关键字问题的答案 https stackoverflow com questions 26255 r
  • 检查文件中是否存在一行

    如何检查文件中是否存在一行 如果该行不存在 我还想将该行写入该文件 这是我目前的尝试 logfile open ip log a while 1 line logfile readline line replace n print line
  • 定义派生类型数组

    我正在尝试使用参数声明初始化派生类型 当我编译时 出现以下错误 1 处的 INTEGER 4 数组构造函数中的元素是 CHARACTER 1 用户定义的种类值ip and dp被发现于fasst global 他们是 integer par
  • WCF服务超时

    我有一个公开 wcf 服务的插件 如果我使用 WCStorm 测试此服务 一切正常 我立即得到答复 当我尝试使用加载插件的应用程序中的服务时 我会超时 ProgrammingMaster ServiceClient aClient new
  • 类型错误:中间件不是函数

    我正在尝试在我的reactjs 应用程序中应用redux 由于这些错误 我无法继续 我确信我已经安装了我需要的所有依赖项 这是我的 package json 的相关部分 dependencies react redux 5 0 6 redu
  • 安装其他package.json依赖项

    简单的问题 是否可以在 package json 中引用另一个 package json 并安装其依赖项 谢谢 是的 这是可能的 并且这是由以下自动完成的npm install 如果你有pkg a这取决于pkg b 包括pkg a在您的依赖
  • 在 python 中快速/优化 N-gram 实现

    python 中哪种 ngram 实现速度最快 我试图分析 nltk 与 scott 的 zip http locallyoptimal com blog 2013 01 20 elegant n gram Generation in py
  • Pygame-旋转精灵并同时跟随路径

    我正在尝试制作一个被抛出的球的动画 我希望它旋转并同时遵循平滑的抛物线路径 然而 我似乎无法得到pygame transform rotate 要合作 到目前为止 这是我尝试过的 import pygame screen pygame di
  • MySQLi 更新准备好的语句不更新数据库

    所以我有这个更新语句 当我转储 POST 变量时 我得到了我想要的输出 stmt dbConnectionW gt prepare UPDATE members SET fname mysqli real escape string dbC
  • 如何在 VS Code 中从命令行打开远程文件夹?

    我可以使用以下命令启动 VS Code 打开本地文件夹code path to folder 是否可以通过在命令行上指定计算机和文件夹来打开远程计算机上的文件夹 通过远程 SSH 扩展 从 Linux 或 Mac 终端上的 cli code
  • 在构建时从 Gradle 设置静态变量

    我有一个 Android 项目 在 git 下管理 Git 有 2 个分支 还有更多 但重要的是那两个 branch a 和branch b 是否可以设置 gradle 来确定项目是从哪个分支构建的并设置public static Stri
  • 如何在 Mercurial 中克隆存储库的子文件夹?

    我有一个 Mercurial 存储库 其中包含一些相关项目 我只想将其中一个项目分支到其他地方进行 是否可以克隆存储库的一部分 这是实现这一目标的正确方法吗 你想要的是一个narrow or partial clone https www
  • 不使用 Math.min 查找数组中的最小值

    如何在不使用的情况下找到数组中的最小数字Math min apply var arr 5 1 9 5 7 const smallest Math min 5 1 9 5 7 console log smallest old way cons
  • 使用应用程序脚本在新的 Google 表格中插入超链接

    在当前版本的 Google Sheet 中 要将超链接插入到单元格中 您可以执行以下操作 sheet getRange row selectedColumn setValue hyperlink ontologyObject accessi
  • RX 自动完成框

    我正在尝试使用 RX 和 WPF 构建过滤器控件 所以我有一个文本框和一个列表框 启动时 列表框有 100 个联系人姓名 用户可以输入姓名来过滤列表 问题是我如何构建文本流 关键输入 然后发布 这应该是时间敏感的 所以我想只有在 750 毫
  • Flask:蓝图中的模板继承自应用程序中的模板?

    我是 Flask Jinja2 的新手 所以也许我忽略了一些明显的事情 但是 Flask 不应该开箱即用地允许蓝图中存在的模板吗 templates 文件夹来扩展由我的应用程序定义的基本模板templates 文件夹 即使蓝图还包含一个 默