Flask—Jinja2

本文详细介绍了在Flask中使用Jinja2模板引擎的过程,包括后端代码和前端代码的集成,以及Jinja2的模板语法,如变量、逻辑、Markup、过滤器、模板继承和宏指令的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Jinja2使用

1. 后端代码

STUDENT_DICT = {
    1: {'name': 'Old', 'age': 38, 'gender': '中'},
    2: {'name': 'Boy', 'age': 73, 'gender': '男'},
    3: {'name': 'EDU', 'age': 84, 'gender': '女'},
}

@app.route("/student")
def student():
    return render_template("student.html", stu_dict=STUDENT_DICT)

2. 前端代码

<tbody>
    {% for skey,sitem in stu_dict.items() %}
        <tr>
            <td>{{ skey }}</td>
            <td>{{ sitem["name"] }}</td>
            <td>{{ sitem.age }}</td>
            <td>
            	{% if stu.get("gender") == "中" %}
        		男
            	{% else %}
            		{{ stu.get("gender") }}
            	{% endif %}
            </td>
        </tr>
    {% endfor %}
</tbody>

二、模板语法介绍

1. 变量

# 应用把变量传递到模板,变量上面也可以有你能访问的属性或元素.
# 变量看起来是什么,完全取决于应用提供了什么,你可以使用点(.)来访问变量的属性;
# 如果变量或属性不存在,会返回一个未定义值

{{ foo.bar }}
{{ foo['bar'] }}

2. 逻辑

{% for %}
{% if %}

3. Markup

# Markup等价 django 的 mark_safe 用于返回有效的html标签
# 功能上时防止XSS攻击,想尽一切办法,将你的脚本内容在目标网站中的目标客户的浏览器上解析执行

# 两种方式使用markup
1. 前端
    {{ my_input|safe }}

2. 后端
    from flask import Flask, Markup
    @app.route("/student")
    def student():
        my_input = "<input type='text'>"
        new_input = Markup(my_input)
        
        return render_template("student.html", my_input=new_input)

4. 过滤器

1. 全局过滤器 - 后端定义后,前端直接使用
    (1)后端逻辑
    @app.template_global()
    def func(a, b):
        return a * b
    
    (2)前端逻辑
    {{ func(100,2) }}

2. 过滤器
    (1)后端逻辑
    @app.template_global()
    def func(a,b):
        return a * b
    
    @app.template_filter()
    def func2(c,d):
        return c * d
    
    (2)前端逻辑
    {{ func(1,2)|func2(10) }} // 前面func算出来的值,会自动传入func2第一个位置

5. 模板和继承

{% extends 'layout.html' %}
{% block body %}
{% endblock %}
# 插件定义
{% include 'asd.html' %}

6. 宏指令

{% macro func_mac(mytype, myname) %}
    <input type="{{ mytype }}" name="{{ myname }}">
{% endmacro %}

{{ func_mac('text', 'username') }}
{{ func_mac('password', 'pwd') }}

 

<think>好的,我现在要帮助用户解决在Flask项目中使用Jinja2模板引擎的内置函数和自定义函数的问题。首先,我需要回顾一下用户提供的引用内容,确保回答准确。 用户提到的引用1到5主要涉及Flask的render_template函数、Jinja2的全局函数、参数传递以及模板渲染机制。根据这些信息,我应该分步骤说明如何使用内置函数和自定义函数。 首先,内置函数部分,Jinja2自带了一些有用的函数,比如range、dict、cycler等。用户可能在模板中需要这些功能,例如循环控制或者生成数据结构。我需要举例说明如何在模板中调用这些内置函数,比如使用range生成序列,或者用dict创建字典。 接下来是自定义函数,这部分用户可能更感兴趣,因为可以扩展模板的功能。根据引用2,全局函数可以是任意函数,没有输入输出限制。用户需要在Flask应用中注册自定义函数,可以通过app.jinja_env.globals添加,或者使用装饰器@app.context_processor。需要详细说明这两种方法,并给出示例代码,比如添加一个格式化日期的函数。 同时,用户可能需要了解如何传递参数到模板,如引用3和5所述,使用render_template时传递变量,然后在模板中使用。这可以和自定义函数结合起来,比如在模板中调用自定义的format_date函数处理日期数据。 另外,需要注意模板文件的存放位置,必须放在templates文件夹下,如引用3提到的。在示例代码中要确保路径正确,避免用户遇到模板找不到的错误。 最后,按照用户要求生成相关问题,可能需要包括内置函数有哪些、如何创建自定义过滤器、上下文处理器的用法等,这些相关问题能帮助用户进一步学习。 现在要确保回答结构清晰,分点说明内置和自定义函数的使用方法,提供代码示例,并正确引用提供的参考文献。特别是引用2关于全局函数的部分,和引用5关于参数传递的部分需要重点引用。</think>在Flask项目中使用Jinja2模板引擎时,可以通过以下方式调用内置函数和自定义函数: ### 一、内置函数用法 Jinja2提供了多种内置函数,可直接在模板中使用: 1. **常用内置函数** - `range()`:生成数字序列 ```html {% for i in range(1, data.mylist|length) %} {{ data.mylist[i] }} {% endfor %} ``` - `dict()`:创建字典对象 ```html {{ dict(key='value') }} ``` - `cycler()`:循环切换值 ```html {% set colors = cycler('red', 'blue') %} <div style="color: {{ colors.next() }}">文本</div> ``` 2. **测试函数** 如`defined()`检查变量是否存在: ```html {% if variable is defined %} {{ variable }} {% endif %} ``` ### 二、自定义函数用法 通过Flask的上下文处理器注册自定义函数: 1. **注册全局函数** ```python from flask import Flask app = Flask(__name__) # 方法1:直接添加全局函数 def format_date(dt): return dt.strftime("%Y-%m-%d %H:%M") app.jinja_env.globals['format_date'] = format_date # 方法2:使用上下文处理器装饰器 @app.context_processor def inject_functions(): return {'reverse_string': lambda s: s[::-1]} ``` 2. **在模板中调用** ```html <!-- 使用日期格式化函数 --> <p>{{ format_date(post.create_time) }}</p> <!-- 使用字符串反转函数 --> <p>{{ reverse_string('hello') }}</p> ``` ### 三、参数传递示例 通过`render_template`传递变量(如引用5所述): ```python @app.route("/") def index(): return render_template('index.html', data={"timestamp": datetime.now()}) ``` ### 四、注意事项 1. 模板文件必须存放在`templates`目录下[^3] 2. 自定义函数需在渲染模板前完成注册 3. 复杂逻辑建议封装成宏(macro)提升可维护性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值