0

    flask——2:flask模板——使用Jinja2

    2023.08.05 | admin | 142次围观

    一,模板引擎

    flask 使用 Jinja2 引擎来渲染模板。

    1,什么是模板

    简单来说,在web应用开发中,后端主要负责业务逻辑,完成请求与响应的逻辑处理及数据读写,前端主要负责表现逻辑,完成应用界面表现与交互逻辑。为了实现前后端的解耦,分离前后端逻辑网页模板是什么,就可以将表现逻辑分离出来交由模板通过模板引擎渲染来实现。

    这样看来,其实模板就是包含静态与动态内容的网页内容。

    2,什么是Jinja2

    Jinja 是一种现代的、对设计人员友好的 Python 模板语言。它具有快速、广泛使用和安全的特性,并且具有可选的沙箱模板执行环境。

    3,什么是模板渲染?

    所谓渲染,其实就是向网页中加载静态内容及动态内容值的过程。

    4,怎样使用模板

    下面是一个最简单的例子:

    1,创建flask项目

    这里以创建flask项目:Hello,Flask!为例。

    2,在项目中的 templates 文件中创建 .html 文件

    应用结构及 .html 内容如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Index</title>
    </head>     
    <body>
        <h1>Hello World!</h1>
    </body>
    </html>
    

    3网页模板是什么,编写路由及试图处理函数

    app.py内容如下:

    from flask import Flask
    from flask import render_template
    @app.route('/')
    def hello_world():
        return render_template('index.html')
    if __name__ == '__main__':
        app.run()
    

    4,运行项目

    二,向模板传参

    当然,动态模板才是最常见的,即多是情况下我们是需要将一些内容传递给模板进行渲染使用的。

    1,传递一个参数

    app.py:

    @app.route('/')
    def hello_world():
        content = "首页内容"
        return render_template('index.html', content=content)
    

    index.html:

    <body>
        <h1>{{ content }}h1>
    body>
    

    2,传递多个参数

    app.py:

    @app.route('/')
    def hello_world():
        title = "首页"
        content = "首页内容"
        return render_template('index.html',
                               content=content,
                               title=title)
    

    index.html:

    <head>
        <meta charset="UTF-8">
        <title>{{ title }}title>
    head>
    <body>
        <h1>{{ content }}h1>
    body>
    

    3,传递所有参数

    上面的方法确实可以向模板传递多个参数,但是太麻烦了, flask 还有另一种方法。

    app.py:

    @app.route('/')
    def hello_world():
        title = "首页"
        content = "首页内容"
        return render_template('index.html', **locals())
    

    flask——2:flask模板——使用Jinja2

    效果与2是一样的,

    三,简单的模板语法

    详细的模板语法请参考Jinja2官方文档,这里只作简单介绍。

    1,delimiters

    在上面的模板中我们看到了一些不同于html原生语法的东西:{{ var }}

    {{ }} 这东西叫分隔符,模板语法中的分隔符有好几个:

    {% ... %} 用于声明,比如在使用for控制语句时

    {{ ... }} 用于打印到模板输出的表达式,比如之前传到到的变量(更准确的叫模板上下文)

    {# ... #} 用于模板注释

    # ... ## 用于行语句,就是对语法的简化

    2,if

    模板语法:

    {% if condition %}
    	do_something
    {% elif condition %}
        do_something
    {% else %}
        do_something
    {% endif %}```
    

    app.py:

    @app.route('/')
    def hello_world(sex):
        title = "首页"
        content = sex
        return render_template('index.html', **locals())
    

    index.html:

    <body>
        {% if content == "男" %}
            <h1>h1>
        {% elif content == "女" %}
            <h1>h1>
        {% else %}
            <h1>性别未知h1>
        {% endif %}
    body>
    

    3,for

    语法:

    {% for item in iteratable_object %}
        do_something
    {% endfor %}
    

    app.py:

    @app.route('/')
    def hello_world():
        title = "首页"
        content = [
            {'name': '张三', 'age': 10},
            {'name': '李四', 'age': 11},
            {'name': '王五', 'age': 12},
        ]
        return render_template('index.html', **locals())
    

    模板:

    <body>
        <h1>人员信息:h1>
        {% for info in content %}
            <span>{{ info.name }}  {{ info.age }}span>
            <br>
        {% endfor %}
    body>
    

    4,filters

    变量可以通过过滤器修改。 过滤器由竖线符号 | 与变量分开,并且括号中可以包含可选参数。 可以链接多个过滤器。 一个滤波器的输出将应用于下一个。

    flask 提供了许多。

    模板:

    <body>
        <h1>人员信息:h1>
        {%for info in content|sort(attribute="age")|sort(reverse=true,attribute="name")%}
            <span>{{ info.name }}  {{ info.age }}span>
            <br>
        {% endfor %}
    body>
    

    过滤器本质就是一个处理函数,能自定义过滤器:

    定义处理函数使用 add_template_filter() 方法添加到模板在模板中使用

    自定义过滤器如下:

    app.py:

    @app.route('/')
    def hello_world():
        title = "首页"
        content = [
            {'name': '张三', 'age': 10},
            {'name': '李四', 'age': 11},
            {'name': '王五', 'age': 12},
        ]
        return render_template('index.html', **locals())
    def do_add_age_number(age_number):
        age = age_number + 3
        return age
    app.add_template_filter(do_add_age_number, 'add_age_number')
    

    模板:

    <body>
        <h1>人员信息:h1>
        {%for info in content %}
            <span>{{ info.name }} : {{ info.age | add_age_number }}span>
            <br>
        {% endfor %}
    body>
    

    5,Macro

    宏可与常规编程语言中的功能媲美。 它们有助于将常用的惯用语放入可重复使用的功能中,从而使一个宏可以被多个模板使用。

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论