flask web学习之模板(一)

文章目录

      • 一、模板基本用法
        • 1.1 定界符
        • 1.2 模板语法
        • 1.3 渲染模板
      • 二、模板辅助工具
        • 2.1 上下文
        • 2.2 全局对象
        • 2.3 过滤器
        • 2.4 测试器
        • 2.5 模板环境对象

在动态web程序中,视图函数返回的HTML数据往往需要根据相应的变量(比如查询参数)动态生成。当HTML代码保存到单独的文件中时,我们没法再使用字符串格式化或拼接字符串的方式在HTML代码中插入变量,这时我们需要模板引擎,我们可以在HTML文件中使用特殊的语法来标记变量,这类包含固定内容和动态部分的可重用文件称为模板。模板引擎的作用就是读取并执行模板中的特殊语法标记,并根据传入的数据将变量替换为实际值,输出最终的HTML页面,这个过程就叫做渲染。flask默认使用的模板引擎是Jinja2,他是一个功能齐全的Python模板引擎。

一、模板基本用法

1.1 定界符
  • 语句:比如if判断、for循环等。{%.....%}
  • 表达式:比如字符串,变量等。{{....}}
  • 注释:{#....#}
1.2 模板语法

Jinja2提供了多种控制结构来控制模板的输出,其中for和if是最常用的两种。

  • if 控制结构
{% if user.bio %}

hahha

{% else %}

wuwuwu

{% endif %}
  • for 控制结构
{% for item in items %}
  • {{item.e}}
  • {% endfor %}

    常用的循环变量

    变量名 说明
    loop.index 当前迭代数(从1开始)
    loop.index() 当前迭代数(从0开始)
    loop.revindex 当前反向迭代数(从1开始)
    loop.revindex() 当前反向迭代数(从0开始)
    loop.first 如果是第一次迭代,则为 True,否则为 False。
    loop.last 如果是最后一次迭代,则为 True,否则为 False。
    loop.length 被迭代的对象的长度
    1.3 渲染模板
    • render_template()函数
    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        data = {
            'title': 'Welcome to My Website',
            'content': 'This is some content for the page.'
        }
        return render_template('index.html', **data)
    
    • render_template_string()函数
    from flask import Flask, render_template_string
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        data = {
            'title': 'Welcome to My Website',
            'content': 'This is some content for the page.'
        }
        template_string = """
        

    {{ title }}

    {{ content }}

    """ return render_template_string(template_string, **data)

    二、模板辅助工具

    2.1 上下文

    在模板上下文里包含很多变量,其中包括手动传和自动传的变量,除了这些之外,我们可以通过set标签在模板里创建变量。

    {% set variable_name = expression %}
    

    也可以将一系列模版定义为变量,使用set和endset定义开始和结束。

    {% set template_header %}
        

    Welcome to My Website

    {% endset %} {% set template_content %}

    This is some content for the page.

    {% endset %}
    {{ template_header }}
    {{ template_content }}
    • 内置上下文变量

    标准模板全局变量

    变量 说明
    config 当前的配置对象
    request 当前的请求对象,在已激活的请求环境下可用
    session 当前的会话对象,在已激活的请求环境下可用
    g 与请求绑定的全局变量,在已激活的请求环境下使用
    • 自定义上下文

    注册模板上下文处理函数

    # flask提供了app.context_processor装饰器,可以用来注册模板上下文处理函数,它可以帮我们完成统一传入变量的工作。
    @app.context_processor
    def inject_foo():
    	foo = "I am folo."
    	return dict(foo=foo)
    

    当我们调用render_template()函数渲染任意一个模板时,所有使用app.context_processor装饰器注册的模板上下文处理函数都会被执行,这些函数的返回值会被添加到模板中,因此我们可以直接在模板中使用foo变量。

    2.2 全局对象
    • 内置全局函数
    全局函数 说明
    url_for(endpoint, **values) 生成指定端点(endpoint)对应的 URL url_for('index', page=2)
    static(filename) 生成静态文件的 URL static('styles.css')
    get_flashed_messages(with_categories=False, category_filter=[]) 用于获取闪现消息,如果没有指定参数,它将返回所有闪现消息的列表。可以通过 with_categories=True 来返回带有分类信息的闪现消息,或者通过 category_filter 来仅返回特定分类的闪现消息
    range() 与python range函数用法一致
    limsum(n=5, html=True, min=20, max=100) 生成随机文本
    • 自定义全局函数
    # 定义一个自定义的全局函数
    @app.template_global()
    def double(x):
        return x * 2
    
    2.3 过滤器

    过滤器用于对变量进行处理和转换,从而实现一些常见的格式化操作。

    • 内置过滤器
    过滤器 说明
    safe 将文本标记为安全,告诉模板引擎不要对其进行转义。例如:{{ my_html_text|safe }}
    default 如果变量不存在或为空,则使用给定的默认值。
    striptags 移除字符串中的 HTML 或 XML 标签。
    trim 去除字符串两侧的空白字符。
    title 将字符串中每个单词的首字母转换为大写。
    capitalize 将字符串中的第一个字符转换为大写,其他字符转换为小写。
    lower 将字符串转换为小写。
    upper 将字符串转换为大写。
    • 自定义过滤器
    @app.template_filter()
    def musical(s):
    	return s*10
    
    # 模板使用
    {{name | musical}}
    
    2.4 测试器

    测试器用于对变量进行逻辑判断和类型检查,从而实现一些常见的条件判断操作。

    • 内置测试器
    测试器 说明
    odd 判断一个数值是否为奇数。
    even 判断一个数值是否为偶数。
    defined 判断一个变量是否已定义。
    none 判断一个变量是否为 None。
    divisibleby 判断一个数值是否可以被给定的数整除。
    string 判断一个变量是否为字符串类型。
    • 自定义测试器
    # 定义一个自定义测试器
    def is_even(value):
        return value % 2 == 0
    
    # 将自定义测试器注册到模板环境中
    app.template_test(is_even)
    
    # 模板使用
    {% if number is even %}
    
    2.5 模板环境对象

    在jinja2中,渲染行为都由jinja2.Environment类控制,所有的配置选项、上下文变量、全局函数、过滤器和测试器都存储在Environment实例上。

    • app.jinja_env.globals: 这是一个字典,包含全局变量,在所有模板中都可用。你可以将自定义的全局变量添加到这个字典中,以便在模板中使用。

    • app.jinja_env.filters: 这是一个字典,包含过滤器函数。过滤器函数可以在模板中用于对变量进行处理和转换,例如格式化日期、截取字符串等。你可以将自定义的过滤器函数添加到这个字典中。

    • app.jinja_env.tests: 这是一个字典,包含测试函数。测试函数用于在模板中进行条件判断,例如检查变量是否为真、是否为列表等。你可以将自定义的测试函数添加到这个字典中。

    • app.jinja_env.globals.update(): 这是一个方法,用于批量添加全局变量。你可以传入一个字典作为参数,其中包含要添加的全局变量及其值。

    • app.jinja_env.get_template(template_name): 这是一个方法,用于获取指定名称的模板。你可以使用这个方法加载模板,并对其进行渲染。

    • app.jinja_env.from_string(template_string): 这是一个方法,用于根据给定的模板字符串创建一个模板对象。你可以使用这个方法动态创建模板,而无需从文件中加载。

    通过操作模板环境对象,你可以定制模板的行为、添加自定义函数和过滤器、设置全局变量等。这使得你可以更灵活地控制模板的渲染过程,并实现一些高级功能。

    你可能感兴趣的:(flask学习,flask)