Jinja2模板与模板继承
发布日期:2021-11-02 02:26:46 浏览次数:0 分类:技术文章

Jinja2

两个概念:

  • Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
  • 模板语言:是一种被设计来自动生成文档的简单文本格式,在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名。

渲染模版函数

  • Flask提供的 render_template 函数封装了该模板引擎
  • render_template 函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。

使用

  • { {}} 来表示变量名,这种 { {}} 语法叫做变量代码块
<h1>{
  { post.title }}</h1>

Jinja2 模版中的变量代码块可以是任意 Python 类型或者对象,只要它能够被 Python 的 str() 方法转换为一个字符串就可以,比如,可以通过下面的方式显示一个字典或者列表中的某个元素:

{
   {
   your_dict['key']}}{
   {
   your_list[0]}}

模板变量

  • 代码中传入字符串,列表,字典到模板中
@app.route('/')def index():    # 往模板中传入的数据    my_str = 'Hello word'    my_int = 10    my_array = [3, 4, 2, 1, 7, 9]    my_dict = {
           'name': 'xiaoming',        'age': 18    }    return render_template('temp_demo1.html',                           my_str=my_str,                           my_int=my_int,                           my_array=my_array,                           my_dict=my_dict                           )
  • 模板中代码
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title></head><body>我的模板html内容<br/>{
  { my_str }}<br/>{
  { my_int }}<br/>{
  { my_array }}<br/>{
  { my_dict }}</body></html>

过滤器

过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器。

使用方式:

  • 过滤器的使用方式为:变量名 | 过滤器。
{
   {
   variable | filter_name(*args)}}
  • 如果没有任何参数传给过滤器,则可以把括号省略掉
{
   {
   variable | filter_name}}

链式调用

在 jinja2 中,过滤器是可以支持链式调用的,示例如下:

{
   {
    "hello world" | reverse | upper }}

过滤器列表操作

  • first:取第一个元素
<p>{
   {
    [1,2,3,4,5,6] | first }}</p>
  • last:取最后一个元素
<p>{
   {
    [1,2,3,4,5,6] | last }}</p>
  • length:获取列表长度
<p>{
   {
    [1,2,3,4,5,6] | length }}</p>
  • sum:列表求和
<p>{
   {
    [1,2,3,4,5,6] | sum }}</p>
  • sort:列表排序
<p>{
  { [6,2,3,1,5,4] | sort }}</p>

自定义过滤器

过滤器的本质是函数。当模板内置的过滤器不能满足需求,可以自定义过滤器。自定义过滤器有两种实现方式:

  • 一种是通过Flask应用对象的 add_template_filter 方法
  • 通过装饰器来实现自定义过滤器

重要:自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。

需求:添加列表反转的过滤器

方式一

通过调用应用程序实例的 add_template_filter 方法实现自定义过滤器。该方法第一个参数是函数名,第二个参数是自定义的过滤器名称:

def do_listreverse(li):    # 通过原列表创建一个新列表    temp_li = list(li)    # 将新列表进行返转    temp_li.reverse()    return temp_liapp.add_template_filter(do_listreverse,'lireverse')

方式二

用装饰器来实现自定义过滤器。装饰器传入的参数是自定义的过滤器名称。

@app.template_filter('lireverse')def do_listreverse(li):    # 通过原列表创建一个新列表    temp_li = list(li)    # 将新列表进行返转    temp_li.reverse()    return temp_li

模板继承

模板继承是为了重用模板中的公共内容。一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。

  • 继承关键字
{
   % extends '父模板名' %}
  • 标签定义的内容
{
   % block 块变量名称 %} {
   % endblock %}
  • 相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。
  • 子模板使用 extends 指令声明这个模板继承自哪个模板
  • 父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()

父模板

  • base.html
{
   % block top %}  顶部菜单{
   % endblock top %}{
   % block content %}{
   % endblock content %}{
   % block bottom %}  底部{
   % endblock bottom %}

子模板

  • extends指令声明这个模板继承自哪
{
   % extends 'base.html' %}{
   % block content %} 需要填充的内容{
   % endblock content %}
  • 模板继承使用时注意点:
    • 不支持多继承
    • 为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行。
    • 不能在一个模板文件中定义多个相同名字的block标签。
    • 当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好。
上一篇:ORM
下一篇:Flask 正则路由匹配——转换器

关于作者

    白红宇是个全栈工程师,前端vue,小程序,app开发到后端框架设计,数据库设计,环境部署上线运维。

最新文章

ieeetran_IEEEtran BibTex样式 2021-07-14
kdevelop编译运行_KDevelop无法以“此会话在另一个正在运行的实例中已经处于活动状态”开始... 2021-07-14
lvm逻辑卷管理_管理LVM 2021-07-14
笔记本电脑电池不耐用_数据存储系统的可靠性,耐用性和可用性之间有何区别?... 2021-07-14
用户空间内存和物理内存映射_映射较大的内存范围,该范围大于物理内存和交换的总大小... 2021-07-14
n字节对齐 代码_大但正确对齐和优化的代码比每指令/操作码打包的字节少的代码快... 2021-07-14
用户空间内存和物理内存映射_映射较大的内存范围,该范围大于物理内存和交换的总大小... 2021-07-14
apt-get dpkg_如何在dpkg,apt-get或aptitude中找到软件包的所有可用版本? 2021-07-14
Windows 7 64位无法在状态码为0xc0000225的VirtualBox / Linux上安装 2021-07-14
caliber读书软件_如何在无头服务器上运行gitbook(使Caliber在无头服务器上运行)?... 2021-07-14
mplayer 播放电台_如何在MPlayer中播放3D电影? 2021-07-14
yum 查看可安装yum包_如何找到可以为文件安装的软件包,例如“ yum includes”?... 2021-07-14
canvas canvas_HTML和Canvas的基础知识 2021-07-14
gcc内联汇编_在Linux上使用GCC内联汇编 2021-07-14
ssh错误,并显示消息“警告:远程主机标识已更改!” 2021-07-14
windows常见问题_Windows上的常见软件列表 2021-07-14
linux usb网卡支持_Linux中的USB标准和支持 2021-07-14
c语言中的序列点_C中的哪些序列点? 2021-07-14
qemu/kvm 桥接_QEMU / KVM中的x数据平面功能 2021-07-14
搜索或添加rss feed_如何过滤RSS feed项目? 2021-07-14