热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flask基础Part3Template模版引擎(Jinja2)

FlaskTemplate模版引擎(Jinja2)变量过滤器转义基本模版子模板结构控制语句ForIFMacrosBlocksIncludeFlaskTemplate模版引擎(Jin

  • Flask Template模版引擎(Jinja2)
    • 变量
    • 过滤器
    • 转义
    • 基本模版
    • 子模板
    • 结构控制语句
      • For
      • IF
    • Macros
    • Blocks
    • Include


Flask Template模版引擎(Jinja2)

Flask利用Jinja2作为模版引擎。模版引擎包含了变量和表达式,当模版被渲染时,它们被替换为值和标签,它们控制着模版的逻辑。

Jinja2默认的几种分割符:

  • {% ... %} 表示声明
  • {{ ... }} 表达式打印到模版输出
  • {# ... #} 对于未包含在模板输出中的注释
  • # ... ## 行语句

变量

传递给模版的上下文字典定义了模版的变量

通过{{ ... }}在模版中打印变量

{{ foo.bar }}
{{ foo['bar'] }}

双花括号不是变量的一部分,而是打印语句。如果访问标签内的变量,在双花括号周围不要再次出现大括号。

如果变量或属性不存在,将会返回一个未定义的值,默认的行为是打印或迭代计算为空字符串,并且每次操作都会失败。
在Flask中如果需要加载静态文件的URL,有两种实现的方法:

<link rel&#61;&#39;stylesheel&#39; href&#61;&#39;/static/css/style.css&#39;>
<link rel&#61;&#39;stylesheel&#39; href&#61;&#39;
{{ url_for(&#39;static&#39;, filename&#61;&#39;css/style.css&#39;) }}&#39;>

过滤器

变量可以通过过滤器进行修改。过滤器通过管道符合&#xff08;|&#xff09;与变量分开&#xff0c;并且可以在括号中包含可选参数。可以链接多个过滤器。一个过滤器的输出应用于下一个过滤器。

例如{{ name | striptags | length }}从name变量中移除所有的HTML标签&#xff0c;并计算长度进行打印输出。

接受参数的过滤器在参数周围有括号&#xff0c;就像函数调用一样。例如&#xff1a;{{ listx | join (&#39;,&#39;) }}将以逗号为间隔将列表进行打印输出&#xff0c;与Python的str.join(&#39;,&#39;, listx)相似。

转义

有时需要或必要让Jinja2忽略它会以变量或块的形式处理的部分。例如&#xff0c;如果使用迷人语法&#xff0c;你希望使用{{作为模版中的原始字符串并且不启动变量。

{{ &#39;{{&#39; }}

对于更大的部分&#xff0c;将原始块标记为块是有意义的&#xff0c;使用{% raw %}。例如&#xff0c;要在模版中包含示例Jinja语法&#xff0c;且不执行代码。

{% raw %}<ul>{% for item in seq %}<li>{{ item }}li>{% endfor %}ul>
{% endraw %}

基本模版

通常会创建一个base.html模版&#xff0c;它定义了一个简单的HTML骨架文档&#xff0c;你可以将它用于简单的三段式页面。让孩子模版来完成空白块内容的填充工作。


<html lang&#61;"en">
<head><meta charset&#61;"UTF-8"><script src&#61;"https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js">script>
<title>{% block title %}{% endblock %}title>{% block extCSS %}<link rel&#61;"stylesheet" href&#61;"{{ url_for(&#39;static&#39;, filename&#61;&#39;css/style.css&#39;) }}">{% endblock %}
head>

<body>
{% block header %}{% endblock %}{% block content %}{% endblock %}{% block footer %}{% endblock %}
body>

html>

在本例中&#xff0c;{% block %} 标签定义了五个可以填充子模版的块&#xff0c;所有块标签都会告诉模板引擎&#xff0c;子模板可能会覆盖模板中的占位符。

子模板

下面介绍下子模版中的示例&#xff1a;

{% extends &#39;base.html&#39; %}
{% block title %}Index{% endblock %}
{% block extCSS %}{{ super() }}<style>.test{color: red;}style>
{% endblock %}
{% block header %}<p>headerp>{% endblock %}
{% block content %}<p>contentp>{% endblock %}
{% block footer %}<p>footerp>{% endblock %}

{% extends %}标签是这里的关键。它告诉模版引擎该模板‘扩展’了另一个模板。当模版系统读取这个模板时&#xff0c;它会首先找到父模板。扩展标签应该是模板中的第一个标签。

通过{{ super() }} 来渲染父模块的内容。这将返回父模块的结果。

结构控制语句

控制结构是指所有那些控制程序流程的东西-条件&#xff08;if/elif/else&#xff09;, for循环&#xff0c;以及宏和块。使用默认语法&#xff0c;控制结构出现在{% ... %}块内。

For

循环顺序中的每个项目。例如&#xff0c;显示一个名为users的变量中提供的用户列表。

<h1>User Listh1>
<ul>
{% for user in users %}<li>user.usernameli>
{% endfor %}
ul>

由于模板中的变量保留了它们的对象属性&#xff0c;因此可以像dict一样遍历容器&#xff1a;

<dl>
{% for key, value in my_dict.iteritems() %}<dt>{{ key }}dt><dd>{{ value }}dd>
{% endfor %}
dl>

在for循环块的内部&#xff0c; 可以访问一些特殊变量

描述
loop.index循环的当前迭代&#xff08;1开始&#xff09;
loop.index0循环的当前迭代&#xff08;0开始&#xff09;
loop.revindex循环倒叙的迭代&#xff08;到1结束&#xff09;
loop.revindex0循环倒叙的迭代&#xff08;到0结束&#xff09;
loop.first如果第一次迭代&#xff0c;则为真
loop.last如果最后次迭代&#xff0c; 则为真
loop.length序列中的项目数量。
loop.cycle在一系列序列之间循环的辅助函数。
loop.depth指示当前呈现的递归循环中有多深。从1开始
loop.depth0指示当前呈现的递归循环中有多深。从0开始
loop.previtem来自上一次循环迭代的项目。在第一次迭代期间未定义。
loop.nextitem来自下一次循环迭代的项目。在最后一次迭代期间未定义。
loop.changed(*val)如果以前用不同的值调用&#xff08;或根本不调用&#xff09;&#xff0c;则为真。

IF

与Python中的if语句相当。用最简单的形式&#xff0c;你可以用它来测试一个变量是否被定义&#xff0c;不是空的和不是false

{% if users %}
<ul>
{% for user in users %}<li>{{ user.username }}li>
{% endfor %}
ul>

{% endif %}

对于多个分支&#xff0c;elif和else可以像在Python中一样使用&#xff0c; 也可以使用更复杂的表达式。

{% if age <18 %}你还未成年
{% elif age &#61;&#61; 18 %}刚好成年
{% else %}你已经不小了
{% endif %}

Macros

宏与常规编程语言中的函数具有可比性。将常用惯用语放入可重复使用的函数中&#xff0c;以便不重复干同样的事情。

{% macro input(name, value&#61;&#39;&#39;, type&#61;&#39;text&#39;, size&#61;20) -%}<input type&#61;"{{ type }}" name&#61;"{{ name }}" value&#61;"{{value|e }}" size&#61;"{{ size }}">
{%- endmacro %}

宏可以被当做一个函数调用&#xff1a;

<div>{{ input(&#39;username&#39;) }}div>
<div>{{ input(&#39;password&#39;, type&#61;&#39;password&#39;) }}div>

Blocks

块用于继承&#xff0c;同时用作占位符和替换。它们在“模板继承”部分详细记录。

Include

include语句对于包含模板并将该文件的渲染内容返回到当前名称空间非常有用&#xff1a;

{% include &#39;header.html&#39; %}Body
{% include &#39;footer.html&#39; %}


推荐阅读
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • jQuery Flot 数据可视化插件:高效绘制图表的专业工具
    jQuery Flot 是一款高效的数据可视化插件,专为绘制各种图表而设计。该工具支持丰富的图表类型和自定义选项,适用于多种应用场景。用户可以通过其官方网站获取示例代码和下载资源,以便快速上手和使用。 ... [详细]
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 【Python爬虫实操】 不创作小说,专精网站内容迁移,超高效!(含源代码)
    本文详细介绍了如何利用Python爬虫技术实现高效网站内容迁移,涵盖前端、后端及Android相关知识点。通过具体实例和源代码,展示了如何精准抓取并迁移网站内容,适合对Python爬虫实战感兴趣的开发者参考。 ... [详细]
  • Django框架进阶教程:掌握Ajax请求的基础知识与应用技巧
    本教程深入探讨了Django框架中Ajax请求的核心概念与实用技巧,帮助开发者掌握异步数据交互的方法,提升Web应用的响应速度和用户体验。通过实例解析,详细介绍了如何在Django项目中高效实现Ajax请求,涵盖从基础配置到复杂场景的应用。 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • Spring Batch 异常处理与任务限制优化策略 ... [详细]
  • 状态模式在软件设计中的应用与实现
    本文以酒店管理系统为例,探讨了状态模式在软件设计中的应用与实现。酒店房间的状态包括空闲、已预订和已入住,这些状态之间可以相互转换。通过引入状态模式,系统能够更加灵活地管理和响应不同状态下的操作,提高了代码的可维护性和扩展性。此外,状态模式还简化了状态转换的逻辑处理,使得系统的整体架构更为清晰和高效。 ... [详细]
  • 工厂方法模式详解:莫勇鹏老师的深入解析与应用实例
    2019年,独角兽企业高薪招聘Python工程师时特别关注工厂方法模式(Factory Method Pattern)。该模式通过定义一个创建对象的接口,让子类决定实例化哪一个类。莫勇鹏老师深入解析了这一设计模式,并提供了丰富的应用实例,帮助开发者更好地理解和运用工厂方法模式,提升软件设计的灵活性和可扩展性。 ... [详细]
  • 如何在 Java LinkedHashMap 中高效地提取首个或末尾的键值对? ... [详细]
  • 本文深入探讨了 Python Watchdog 库的使用方法和应用场景。通过详细的代码示例,展示了如何利用 Watchdog 监控文件系统的变化,包括文件的创建、修改和删除等操作。文章不仅介绍了 Watchdog 的基本功能,还探讨了其在实际项目中的高级应用,如日志监控和自动化任务触发。读者将能够全面了解 Watchdog 的工作原理及其在不同场景下的应用技巧。 ... [详细]
  • Java 8 引入了 Stream API,这一新特性极大地增强了集合数据的处理能力。通过 Stream API,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析 Stream API 的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 利用ViewComponents在Asp.Net Core中构建高效分页组件
    通过运用 ViewComponents 技术,在 Asp.Net Core 中实现了高效的分页组件开发。本文详细介绍了如何通过创建 `PaginationViewComponent` 类并利用 `HelloWorld.DataContext` 上下文,实现对分页参数的定义与管理,从而提升 Web 应用程序的性能和用户体验。 ... [详细]
author-avatar
jeson1232
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有