• 六、Flask模板使用方法


    Flask模板使用方法


    Flask使用Jinja2作为默认的模板引擎,可以轻松地将动态数据渲染到HTML页面中。以下是Flask模板的基本使用方法:

    首先,在Flask应用程序的根目录下创建一个名为templates的文件夹,用于存放HTML模板文件。

    在Python代码中导入必要的模块:

    from flask import Flask, render_template
    
    • 1

    创建Flask应用程序对象:

    app = Flask(__name__)
    
    • 1

    创建路由,并在处理函数中渲染模板:

    @app.route('/')
    def index():
        return render_template('index.html')
    
    • 1
    • 2
    • 3

    在模板文件(比如index.html)中,使用Jinja2语法来插入动态数据:

    <h1>Hello, {{ name }}!h1>
    
    • 1
    # 在处理函数中,可以通过传递参数来动态渲染模板:
    
    @app.route('/greet/')
    def greet(name):
        return render_template('index.html', name=name)
    
    # 启动Flask应用程序:
    if __name__ == '__main__':
        app.run()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这样,当用户访问根路由(/)时,Flask将渲染index.html模板并将其返回给用户。在模板中使用双花括号**({{ … }})**来插入动态数据。

    Flask模板高级使用方法

    除了基本的模板使用方法,Flask模板还提供了一些高级功能,如下所示:

    1. 控制流

    使用Jinja2的控制流语句,可以根据条件或循环来动态生成内容。

    • if语句:
    {% if condition %}
        <!-- 条件满足时的内容 -->
    {% else %}
        <!-- 条件不满足时的内容 -->
    {% endif %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • for循环:
    {% for item in sequence %}
        <!-- 循环中的内容 -->
    {% endfor %}
    
    • 1
    • 2
    • 3

    2. 模板继承

    使用模板继承,可以创建一个基础模板,并在其他模板中继承和扩展它。

    • 基础模板(base.html):
    <!DOCTYPE html>
    <html>
    <head>
        <title>{% block title %}{% endblock %}</title>
    </head>
    <body>
        {% block content %}{% endblock %}
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 继承模板:
    {% extends 'base.html' %}
    {% block title %}
        My Page
    {% endblock %}
    {% block content %}
        
    {% endblock %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3. 模板中的宏

    使用宏(Macro)可以在模板中定义可重用的代码

    • 定义宏:
    {% macro greeting(name) %}
        <h1>Hello, {{ name }}!h1>
    {% endmacro %}
    
    • 1
    • 2
    • 3

    在模板中调用宏:

    {{ greeting('Alice') }}
    
    • 1

    4. 模板过滤器

    Jinja2提供了许多内置的过滤器,用于对模板中的变量进行处理或格式化。

    使用过滤器:

    {{ variable|filter }}
    
    • 1

    示例:

    {{ message|capitalize }}  
    {{ amount|currency }}     
    
    • 1
    • 2

    5. URL生成

    Flask提供了便捷的方式来生成URL,避免在模板中手动编写URL路径。
    生成URL:

    {{ url_for('route_name', arg1=value1, arg2=value2) }}
    
    • 1

    示例:

    <a href="{{ url_for('index') }}">Homea>
    
    • 1

    Flask模板的原理解析

    基本原理

    Flask使用Jinja2作为默认的模板引擎,Jinja2是一个基于Python的模板引擎,它采用了类似于Django模板语言的语法,具有强大的模板功能和灵活的扩展性。

    在Flask中,模板文件是包含动态内容和静态内容的HTML文件。当用户请求一个包含模板的页面时,Flask会调用Jinja2引擎,将模板中的动态部分填充并生成最终的HTML响应。

    Flask模板引擎的工作原理如下:

    • Flask应用程序加载模板引擎并配置相关设置。
    • 当用户请求一个包含模板的页面时,Flask会找到相应的路由处理函数。
    • 在路由处理函数中,使用render_template函数指定要渲染的模板文件
    • Flask将模板文件路径传递给Jinja2引擎。
    • Jinja2引擎解析模板文件,查找其中的特殊标记和语法。
    • 引擎根据模板中的动态内容生成对应的HTML代码。
    • 生成的HTML响应返回给Flask应用程序,由应用程序发送给客户端浏览器。
    • Jinja2引擎的特点是它具有强大的模板语法,可以处理条件、循环、变量插值等复杂的逻辑和数据操作,使得模板文件可以灵活地生成动态内容。

    代码层面解析

    在Flask中,通过render_template函数将模板文件渲染为最终的HTML响应。render_template函数位于flask模块的templating子模块中,其实现涉及以下主要步骤:

    • render_template函数接受模板文件名和一系列参数作为输入。
    • 它首先创建一个jinja2.Environment对象,用于加载和渲染模板。
    • 然后,它使用jinja2.Environment对象的get_template方法加载指定的模板文件。
    • 加载后的模板对象用于渲染,通过调用模板对象的render方法,并传入参数,生成最终的HTML代码。
    • 最后,render_template函数返回HTML响应。

    案例说明

    下面是一个包含Flask模板各种高级用法的示例应用:

    代码内容
    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return render_template('index.html', name='Alice')
    
    @app.route('/greet/')
    def greet(name):
        return render_template('greet.html', name=name)
    
    @app.route('/dashboard')
    def dashboard():
        data = {'username': 'Alice', 'age': 25, 'country': 'USA'}
        return render_template('dashboard.html', data=data)
    
    if __name__ == '__main__':
        app.run()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在应用的根目录下创建一个名为templates的文件夹,并在该文件夹中创建以下模板文件:

    index.html模板文件:

    DOCTYPE html>
    <html>
    <head>
        <title>Flask Template Exampletitle>
    head>
    <body>
        <h1>Hello, {{ name }}!h1>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    greet.html模板文件:

    DOCTYPE html>
    <html>
    <head>
        <title>Flask Template Exampletitle>
    head>
    <body>
        <h1>Greetings, {{ name }}!h1>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    base.html基础模板文件:

    DOCTYPE html>
    <html>
    <head>
        <title>{% block title %}{% endblock %}title>
    head>
    <body>
        <header>
            <h1>Welcome to my Websiteh1>
        header>
        <nav>
            <ul>
                <li><a href="/">Homea>li>
                <li><a href="/greet/John">Greet Johna>li>
                <li><a href="/dashboard">Dashboarda>li>
            ul>
        nav>
        <main>
            {% block content %}{% endblock %}
        main>
    
        <footer>
            <p>© 2023 My Website. All rights reserved.p>
        footer>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    dashboard.html继承模板文件:

    {% extends 'base.html' %}
    
    {% block title %}
        Dashboard
    {% endblock %}
    
    {% block content %}
        <h2>Welcome, {{ data.username }}!h2>
        <p>Age: {{ data.age }}p>
        <p>Country: {{ data.country }}p>
    {% endblock %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这个示例应用中,我们引入了模板继承和宏的使用,具体如下:

    • 在base.html中定义了一个基础模板,其中使用了模板继承的{% block %}标记来定义可被子模板重写的块。
    • dashboard.html继承了base.html,并在{% block content %}块中扩展了自己的内容。
    • 在dashboard路由处理函数中,我们将一个名为data的字典传递给模板,模板中使用了该数据来动态生成内容。

    通过这个示例应用,您可以学习到Flask模板的高级用法,包括模板继承、定义块、重写块、传递数据等。这些功能可以帮助您构建更复杂和灵

    代码目录结构:
    myapp/
    ├── templates/
    │   ├── base.html
    │   ├── index.html
    │   ├── greet.html
    │   └── dashboard.html
    └── app.py
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这个示例中,应用的根目录为myapp,其中包含一个名为templates的文件夹,用于存放模板文件。模板文件的命名和内容在前面的回答中已经提到。

    app.py是应用的入口文件,包含了Flask应用的路由和视图函数的定义。在这个文件中,我们引入了Flask和render_template,并创建了一个名为app的Flask对象。

    整体的代码目录结构比较简单,模板文件存放在templates文件夹中,而应用的其他代码和配置可以根据实际需求进行扩展和组织。注意,Flask对模板文件的加载是基于模板文件相对于应用根目录的路径进行的,因此要确保模板文件位于templates文件夹下并且与app.py在同一目录级别。

    开发过程中常用的方法

    开发过程中,常用的一些模板方法包括:

    • 变量插值:使用双花括号{{ … }}将变量插入到模板中,如 {{ name }}。

    • 控制流语句:使用控制流语句控制模板的渲染逻辑,如条件判断和循环。

      • {% if condition %} … {% endif %}:条件判断语句,根据条件决定是否渲染特定的内容。
      • {% for item in sequence %} … {% endfor %}:循环语句,遍历一个序列并重复渲染相应的内容。
    • 宏(Macro):宏类似于函数,用于封装可重用的代码块,提高模板的可维护性和重用性。

      • {% macro name(arg1, arg2) %} … {% endmacro %}:定义宏。
      • {{ name(value1, value2) }}:调用宏。
    • 模板继承:通过继承一个基础模板,可以重写块并在子模板中插入自定义内容。

      • {% extends ‘base.html’ %}:继承一个基础模板。
      • {% block name %} … {% endblock %}:定义块,子模板中可以重写该块。
    • 过滤器(Filter):用于对变量进行处理或格式化,如字符串处理、日期格式化等。{{ variable | filter }}:使用过滤器对变量进行处理。

  • 相关阅读:
    【数据库初阶】SQL--DML
    【人工智能】本地运行开源项目MMSegmentation引发的问题
    MyBatis一对多关联查询
    JSQLParser用于解析SQL语句并创建抽象语法树(AST)
    Docker 哲学 - 容器操作
    java springboot电子产品销售网站的设计与实现源码
    nodejs--开发自己的项目——2.1--优化-封装响应给客户端的内容- res.send(状态和错误消息)
    Linux之NFS服务器
    Redis内存回收机制-内存淘汰策略和过期策略
    【原创】修复vCenter的Web界面无法启动的问题
  • 原文地址:https://blog.csdn.net/weixin_45014634/article/details/130679261