当前位置: 首页 > 知识库问答 >
问题:

Pebble模板继承失败没有错误

葛磊
2023-03-14

我在Spring Boot 2中使用Pebble模板引擎,在我开始使用继承之前,一切都正常。浏览器显示一个空页面,根本不返回任何内容。不幸的是,服务器和Catalina(我使用的是Tomcat 8.5)日志没有显示错误。

在我的pom中,我有以下依赖项:

  • Spring Boot 2.0.3(作为父级)
  • peble-sping-boot-2-starter(尝试了2.6.2和3.0.0。BETA01)
  • Spring-引导-启动器-数据-jp a
  • Spring-引导-启动-网页
  • Spring-引导-启动-安全

我有以下application.properties

  • pebble.suffix=.html.peb
  • pebble.cache=false(也试过true)

我的父模板(参考资料/模板/base.html.peb)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head></head>
<body>Template test</body>
</html>

我的子模板(参考资料/模板/child.html.peb)

{% extends "base.html.peb" %}

当我删除继承时,Pebble工作得很好,并且包含并显示了模型,所以Pebble工作得很好。

共有1个答案

毕宏盛
2023-03-14

Pebble Spring Boot Starter通过连接前缀、模板名称和后缀来解析模板路径:

公共类PebbleTemplateAvailabilityProvider实现TemplateAvailabilityProvider{

@Override
public boolean isTemplateAvailable(String view, Environment environment, ClassLoader classLoader,
        ResourceLoader resourceLoader) {
    if (ClassUtils.isPresent("com.mitchellbosecke.pebble.PebbleEngine", classLoader)) {
        String prefix = environment.getProperty("pebble.prefix", PebbleProperties.DEFAULT_PREFIX);
        String suffix = environment.getProperty("pebble.suffix", PebbleProperties.DEFAULT_SUFFIX);
        return resourceLoader.getResource(ResourceLoader.CLASSPATH_URL_PREFIX + prefix + view + suffix).exists();
    } else {
        return false;
    }
}

}

如果在“extends”指令中使用后缀指定模板,则会再次附加后缀,并且找不到模板,类似于:

资源/模板/base.html.peb.html.peb

为了解决这个问题,必须在“扩展”指令中指定没有前缀的卵石模板名称:

{% extends "base" %}

对我来说,这是一个bug。Pebble Spring Boot Starter应该能够检测到基本模板是否指定了后缀。

 类似资料:
  • Jinja 最为强大的地方在于他的模板继承功能,模板继承允许你创建一个基础的骨架模板, 这个模板包含您网站的通用元素,并且定义子模板可以重载的 blocks 。 听起来虽然复杂,但是其实非常初级。理解概念的最好方法就是通过例子。 基础模板 在这个叫做 layout.html 的模板中定义了一个简单的 HTML 文档骨架,你可以 将这个骨架用作一个简单的双栏页面。而子模板负责填充空白的 block:

  • 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部、尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板中填充 extends继承:继承,写在模板文件的第一行 定义父模板base.html { % block block_name % } 这里可以定义默认值 如果不定义默认值,则表示空字符串 { %

  • Jade 支持通过 block 和 extends 关键字来实现模板继承。 一个块就是一个Jade的"block" ,它将在子模板中实现,同时是支持递归的。 Jade 块如果没有内容,Jade会添加默认内容,下面的代码默认会输出block scripts, block content, 和 block foot. html head h1 My Site - #{title}

  • 继承 继承能够创建可复用的模板,定义页面的骨架,然后被子模板填充,子模板又可以作为父模板被继承。 继承主要通过两个标签语法实现 <t:template> 定义要继承的父模板 <b:block> 在父模板中用来定义可以被填充的区域;在子模板中用来定义将内容填充到父模板的指定区域 定义父模板 layout.vdt <div> <b:header> <div>父模板头部</div> </

  • 模板继承是 ThinkCMF推荐一种布局方式,它比上一篇讲的模板布局更灵活;模板继承就是你先定义一个基础的模板,在这个基础模板你可以设置很多个区块( block),然后在其它实际要渲染的子模板文件中用 extend标签继承这个基础模板,在子模板中定义name相同的 block,这样就可以对基础模板中定义的区块进行重载; 每个区块都是<block></block>这样的标签,如: <block na

  • 模板继承是 ThinkCMF推荐一种布局方式,它比上一篇讲的模板布局更灵活;模板继承就是你先定义一个基础的模板,在这个基础模板你可以设置很多个区块( block),然后在其它实际要渲染的子模板文件中用 extend标签继承这个基础模板,在子模板中定义name相同的 block,这样就可以对基础模板中定义的区块进行重载; 每个区块都是<block></block>这样的标签,如: <block na