Code前端首页关于Code前端联系我们

Flask 轻量级 Python 框架:JinJa2 语法介绍和示例解释

terry 2年前 (2023-09-24) 阅读数 62 #后端开发

1. 概述

Flask 是一个支持 JinJa2 模板引擎的轻量级 Python Web 框架。 Jinja2 是一种流行的 Python 模板工具,可用于使用 Flask 构建动态 Web 应用程序。

网站一般需要html、css和js。刚开始学习python web时,可以这样写:

from flask import Flask
 
app = Flask(__name__)
 
@app.route('/')
def hello():
    return '<h1>hello</h1><p style="color:red">hello world!!!</p>'
 
if __name__ == '__main__':
	app.run(host='0.0.0.0', port=8000, debug=True)

上面的代码虽然也能运行,但是不太漂亮。现在的编程基本上是前端和后端分离。客户端代码不会被注入到代理服务器中。为了实现前后端分离,采用MVT设计方案:

  • M写为Model,与MVC中的M功能相同,为负责与数据库交互和数据处理。
  • V 写作View。它与MVC中的C的功能相同。它接收请求、执行业务处理并返回响应。
  • T写为Template,与MVC中的V功能相同,负责封装和构建要返回的html。 ? 。在 Flask 中,您可以通过将变量传递给模板来显示变量。示例代码如下:
    # variable.py
    # Flask中将变量传递给模板
    from flask import Flask, render_template
    
    app = Flask(__name__)
    # 也可指定模板目录
    # app = Flask(__name__, template_folder="/opt/python-projects/flask")
    
    @app.route('/')
    def hello():
        name = "Alice"
        return render_template('variable.html', name=name)
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8000, debug=True)
    

    在上面的代码中,变量name被传递给模板hello.html

    <!-- templates/variable.html模板 -->
    <!DOCTYPE html>
    <html>
    <head>
        <title>variable</title>
    </head>
    <body>
        <h1>hello {{ name }}!</h1>
    </body>
    </html>
    

    执行

    python3 variable.py
    

    访问

    curl http://192.168.182.110:8000/
    

    2)控制结构

    在Jinja 2中,您可以使用 if,和等命令控制输出模板。示例代码如下:

    # if.py
    # Flask中使用if控制结构
    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        user = {"name": "Alice", "age": 25}
        return render_template('if.html', user=user)
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8000, debug=True)
    

    templates/if.html 模板文件

    <!-- if.html模板 -->
    <!DOCTYPE html>
    <html>
    <head>
        <title>Hello</title>
    </head>
    <body>
        {% if user %}
            {% if user.age >= 18 %}
                <h1>Hello {{ user.name }}, you are an adult!</h1>
            {% else %}
                <h1>Hello {{ user.name }}, you are a minor!</h1>
            {% endif %}
        {% else %}
            <h1>Hello, anonymous user!</h1>
        {% endif %}
    </body>
    </html>
    

    在上面的代码中,使用 if 语句来控制输出,根据用户的年龄显示不同的消息。

    3) 循环结构

    在 Jinja 2 中,您可以使用表达式 for 来循环模板中的内容。示例代码如下:

    # for.py
    # Flask中使用for循环结构
    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        users = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]
        return render_template('for.html', users=users)
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8000, debug=True)
    

    templates/for.html 模板文件

    <!-- for.html模板 -->
    <!DOCTYPE html>
    <html>
    <head>
        <title>Hello</title>
    </head>
    <body>
        {% for user in users %}
            <h1>Hello {{ user.name }}!</h1>
            <p>You are {{ user.age }} years old.</p>
        {% endfor %}
    </body>
    </html>
    

    在上述代码中,使用for循环来循环遍历用户列表信息。 。

    4) 宏

    在 Jinja 2 中,您可以使用宏来定义可重用的代码块。示例代码如下:

    # great.py
    # Flask中使用宏
    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        users = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]
        return render_template('great.html', users=users)
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8000, debug=True)
    

    定义宏templates/macros.html模板

    # 定义一个宏
    {% macro print_user(user) %}
        <h1>Hello {{ user.name }}!</h1>
        <p>You are {{ user.age }} years old.</p>
    {% endmacro %}
    

    在上面的代码中,定义了一个名为print_us的宏。在模板中,您可以通过import导入宏,并使用该宏输出用户信息。模板templates/great.html

    <!-- great.html模板 -->
    <!DOCTYPE html>
    <html>
    <head>
        <title>Hello</title>
    </head>
    <body>
        {% for user in users %}
            {% import 'macros.html' as macros %}
            {{ macros.print_user(user) }}
        {% endfor %}
    </body>
    </html>
    

    在上面的代码中,定义了一个名为print_user的宏来输出用户信息。

    5) 过滤器

    在 Jinja 2 中,过滤器可以处理日期格式、大小写转换等变量。示例代码如下:

    # filter.py
    # Flask中使用过滤器
    from flask import Flask, render_template
    import datetime
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        now = datetime.datetime.now()
        return render_template('filter.html', now=now)
    
    # 自定义过滤器
    @app.template_filter('datetimeformat')
    def datetimeformat(value, format='%Y-%m-%d %H:%M:%S'):
        return value.strftime(format)
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8000, debug=True)
    

    模板文件 模板平台 在上述代码中,定义了一个名为 datetimeformat 的过滤器,用于格式化日期和时间。这里是自定义过滤器。事实上,JinJa2还内置了几个过滤器。 Jinja 2 中的内置过滤器:https://jinja.palletsprojects.com/en/3.0.x/templates/#filters

    过滤器名称说明示例
    ab 返回绝对值数字 {{ -1|abs }}
    int(value)将值转换为 int 类型 {{ param | int }}
    float(value )将值转换为 float 类型
    string(value)将变量转换为字符串
    default_
    default(value,)‸ 如果当前变量没有值,将使用参数中的值。如果想用python来判断是否为false,可以指定boolean=true。您还可以使用或替换 {{ name|default('xiaotuo') }}
    safe(value)如果开启全局转义,安全过滤器将禁用变量转义{{ content_html |safe } }
    escape(value) 或 e 转义字符,将 等符号转换为 HTML 符号 {{ content|escape 或 content| e }}
    first(value) 返回序列的第一个元素 {{ names|first }}
    format(value,*arags,ingtingKwargs)%s "-" %s"|format('Hello?',"Foo!") }} 输出 Hello?-Crazy!
    last(value) 返回序列的最后一个元素。{{名称|最后 }}
    length(value) 返回序列或字典的长度。{{名称|长度}}ue,=join )使用以下命令将序列连接到字符串中d 参数值
    lower(value)将字符串转换为小写
    uppercase(value)将字符串转换为小写 Replace(value,old,new)将替换 old 的字符串替换为new
    shorten(value,length=255 ,killwords=False)捕获长度为
    estriptag的字符串删除字符串中的所有HTML标签如果出现多个空格,它们将被替换为单个空格space
    trim捕获字符串前后的空格 {{ p123 | trim }}
    wordcount计算长字符串中的单词数

    6) 继承

    在 Jinja 2 中,您可以使用继承来创建包含公共元素的模板,并通过继承该模板来创建更具体的模板。示例代码如下: 上述文件中的

    # extend.py
    # Flask中使用继承
    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return render_template('extend.html')
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8000, debug=True)
    

    模板文件templates/base.html

    <!-- base.html模板 -->
    <!DOCTYPE html>
    <html>
    <head>
        <title>{% block title %}{% endblock %}</title>
    </head>
    <body>
        {% block content %}{% endblock %}
    </body>
    </html>
    

    模板文件html‽sablony/extend.html

    <!-- extend.html模板 -->
    {% extends "base.html" %}
    
    {% block title %}Hello{% endblock %}
    
    {% block content %}
        <h1>Hello World!</h1>
    {% endblock %}
    

    。模板

    在模板extend.html中定义并继承此模板。 extend.html 模板可以覆盖模板中的 base.html 块并向其中添加新内容。

    7) 包含

    在 Jinja 2 中,您可以使用 include 将一个模板包含在另一个模板中。示例代码如下:

    # contain.py
    # Flask中使用包含
    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return render_template('contain.html')
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8000, debug=True)
    

    模板文件templates/contain.html

    <!-- contain.html模板 -->
    <!DOCTYPE html>
    <html>
    <head>
        <title>{% block title %}{% endblock %}</title>
    </head>
    <body>
        {% block content %}{% endblock %}
        {% include "footer.html" %}
    </body>
    </html>
    

    模板文件模板html

    <!-- footer.html模板 -->
    <footer>
        <p>&copy; 2023</p>
    </footer>
    

    位于名为footer.html

    <!-- footer.html模板 -->
    <footer>
        <p>&copy; 2023</p>
    </footer>
    

    的文件中,模板

    # extend.py
    # Flask中使用继承
    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello():
        return render_template('extend.html')
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8000, debug=True)
    

    定义并使用模板 contain.html 中的 include 将模板 footer.html 包含在页面底部。这样您就可以避免向每个页面重复添加相同的页脚。

    本文介绍了 Python Flask Jinja 2 语法的基础知识,包括变量、控制结构、循环结构和宏等,以及过滤器、继承和包含等高级功能。借助这些功能,您可以更方便地开发动态Web应用程序。使用这些基础知识,您可以快速开发动态 Web 应用程序。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门