zoukankan      html  css  js  c++  java
  • Python Flask Jinja2模板引擎

    模板

    简介

    模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请
    求的上下文中才能知道。

    渲染

    使用真实值替换变量,再返回最终得到的响应字符串,这一过程
    称为渲染。为了渲染模板,Flask 使用了一个名为 Jinja2 的强大模板引擎。
    以下列代码为例:

    from flask import Flask, render_template
    # ...
    @app.route('/')
    def index():
    return render_template('index.html')
    @app.route('/user/<name>')
    def user(name):
    return render_template('user.html', name=name)
    

    render_template函数的第一个参数是模板的文件名。随后的参数都是键值对,表示模板中变量对应的真实值。

    变量

    <h1>Hello, {{ name }}!</h1>
    

    上面html中的name即为变量,它是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取。

    控制结构

    Jinja2 提供了多种控制结构,可用来改变模板的渲染流程。

    条件语句

    {% if user %}
    Hello, {{ user }}!
    {% else %}
    Hello, Stranger!
    {% endif %}
    

    循环语句

    <ul>
    {% for comment in comments %}
    <li>{{ comment }}</li>
    {% endfor %}
    </ul>
    

    {% macro render_comment(comment) %}
    <li>{{ comment }}</li>
    {% endmacro %}
    <ul>
    {% for comment in comments %}
    {{ render_comment(comment) }}
    {% endfor %}
    </ul>
    

    需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复:
    {% include 'common.html' %}

    模板继承

    模板继承是一种强大的复用代码的方式。
    首先,创建一个名为 base.html 的基模板:

    <html>
    <head>
    {% block head %}
    <title>{% block title %}{% endblock %} - My Application</title>
    {% endblock %}
    </head>
    <body>
    {% block body %}
    {% endblock %}
    </body>
    </html>
    

    block 标签定义的元素可在衍生模板中修改。在本例中,我们定义了名为head 、title和body的块。

    衍生模板示例

    {% extends "base.html" %}
    {% block title %}Index{% endblock %}
    {% block head %}
    {{ super() }}
    <style>
    </style>
    {% endblock %}
    {% block body %}
    <h1>Hello, World!</h1>
    {% endblock %}
    

    extends 指令声明这个模板衍生自base.html。在 extends 指令之后,基模板中的3个块被重新定义,模板引擎会将其插入适当的位置。注意新定义的head 块,在基模板中其内容不是空的,所以使用super()获取原来的内容。

    经模板的衍生,上述html代码已经变成:

    <html>
    <head>
    {% block head %}
    <title>{% block title %}Index{% endblock %} - My Application</title>
    <style>
    </style>
    {% endblock %}
    </head>
    <body>
    {% block body %}
    <h1>Hello, World!</h1>
    {% endblock %}
    </body>
    </html>
    

    参考:
    《FlaskWeb开发:基于python的web应用开发实战》

  • 相关阅读:
    hdu5628 Clarke and math
    LOJ#2452. 「POI2010」反对称 Antisymmetry
    LOJ#2444. 「NOI2011」阿狸的打字机
    BZOJ2795: [Poi2012]A Horrible Poem
    LOJ#2427. 「POI2010」珍珠项链 Beads
    云主机文件系统readonly处理案例
    兼容性测试中如何切换和管理多个JDK版本
    Promise之你看得懂的Promise
    一次MySQL线上慢查询分析及索引使用
    考拉消息中心消息盒子处理重构(策略模式)
  • 原文地址:https://www.cnblogs.com/cknightx/p/7639594.html
Copyright © 2011-2022 走看看