0

0

python中Jinja2是什么?如何使用?

不言

不言

发布时间:2018-10-25 15:54:30

|

13980人浏览过

|

来源于segmentfault

转载

本篇文章给大家带来的内容是关于python中jinja2是什么?如何使用?,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

什么是Jinja2

Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能,这对大多应用的安全性来说是非常重要的。

基于unicode并能在python2.4之后的版本运行,包括python3。

如何使用Jinja2

立即学习Python免费学习笔记(深入)”;

要想使用Jinja2模板,需要从flask导入render_template函数,然后在路由函数中调用render_template函数,该函数第一个参数就是模板名字。模板默认保存在目录。

最简单的模板文件就是普通的HTML文件,但静态文件没什么意义,需要在访问路由时传入响应的参数,并在模板中以一定的样式显示在浏览器中,因此,需要用到render_template函数的关键字参数。假设有一个模板文件hello.html,代码如下:

<h1> hello,{{name}}.</h1>

这个用{{......}}括起来的部分就是模板表达式。在使用render_template函数调用模板文件hello.html时,需要通过关键字参数指定name值。

render_template('hello.html',name='star')

返回给客户端时,{{name}}会被替换成star.
网页输出代码

<h1> hello,star.</h1>

jinja2常用语法

1.变量显示语法: {{ 变量名 }}
2. for循环:
{% for i in li%}
{% endfor %}
3. if语句
{% if user == 'westos'%}
{% elif user == 'hello' %}
{% else %}
{% endif%}

数据显示

# templates目录里面建立mubna.html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hello</title>
</head>
<body>
<p>变量:{{ name }}</p>
<p>列表:{{ li }}</p>
<p>列表元素:
{% for item in li  %}
<br/>{{ item }}
{% endfor %}</p>
<p>字典:{{ d }}</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/ai/2092" title="PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用"><img
                                                                                src="https://img.php.cn/upload/ai_manual/000/000/000/175679993727189.png" alt="PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/ai/2092" title="PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用">PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用</a>
                                                                        <p>一键操作,智能生成专业级PPT</p>
                                                                </div>
                                                                <a href="/ai/2092" title="PPT.CN,PPTCN,PPT.CN是什么,PPT.CN官网,PPT.CN如何使用" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div>
<p>字典元素:
{{ d.a }}
{{ d['b'] }}</p>
<p>对象:{{ u }}</p>
<table>
    <tr>
        <td>用户</td>
        <td>密码</td>
    </tr>
    <tr>
        <td>{{ u.name }}</td>
        <td>{{ u.passwd }}</td>
    </tr>

</table>

</body>
</html>
from flask import Flask, render_template

app = Flask(__name__)

class User(object):
    def __init__(self, name, passwd):
        self.name = name
        self.passwd = passwd

    def __str__(self):
        return  "<User: %s>" %(self.name)

@app.route('/')
def index1():
    name = "sheen is cute !!"
    li = [1, 2, 4, 5]
    d = dict(a=1, b=2)
    u = User("westos", "passwd")
    return  render_template('muban.html',
                            name = name,
                            li = li,
                            d = d,
                            u = u
                            )

app.run()

2949133028-5bd13033e2dcc_articlex.png

模板中的过滤器

服务端给客户端返回的数据可能来自于多种数据源。这些数据格式可能并不能满足客户端需求,就需要对数据进行再加工。
过滤器需要放在模板表达式变量的后面,与变量之间用'|'分割,{{ vlaue|upper}}将value英文字母都转换为大写形式。

编写一个时间过滤器,将时间戳转换为特定格式的字符串时间

from flask import Flask, render_template
import time
app = Flask(__name__)


def time_format(value,format="%Y-%m-%d %H:%M:%S"):
    #  时间戳----> 元组
    t_time = time.localtime(value)
    #  元组  ----> 指定字符串
    return time.strftime(format,t_time)
# 第一个参数是过滤器函数,第二个参数是过滤器名称
app.add_template_filter(time_format,'time_format')

@app.route('/chtime/')
def chtime():
    return render_template('chtime.html',timestamp = time.time())


app.run()
# templates/目录下的chtime.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
时间戳
{{ timestamp }}
<br/>
格式化后的时间
{{ timestamp | time_format }}

</body>
</html>

2715859521-5bd13071c2ff8_articlex.png

宏操作

在编写python程序时,会有很多地方调用同样或类似的代码。这种情况,可以把重复使用的代码放到函数或类中,只需要访问函数或类的实例就可以实现代码复用。Jinja2 模板中使用宏来防止代码冗余。

Jinja2 模板中的宏需要放到{%......%},使用修饰,支持参数,并且使用{% endmacro %}结束

如果宏要被多个模板文件共享,就需要将宏单独放到一个模板文件中,然后使用{% import ….%}指令导入该模板

调用宏,实现登陆页面的模板继承

## templates/目录下的macro.html
{% macro input(type,  name, text ) %}

 <p class="form-group">
            <label>{{ text }}</label>
            <input name={{ name }} type={{ type }} class="form-control">
        </p>
{% endmacro %}
# # templates/目录下的login.html
{% extends "base.html" %}

{% block title %}
登陆
{% endblock %}


{% block content %}
<p class="container container-small">
    <h1>登录
        <small>没有账号?<a href="signup.html">注册</a></small>
    </h1>

{#    /*将表单信息提交给/login路由对应的函数进行处理, 并且提交信息的方式为post方法, 为了密码的安全性*/#}
    <form action="/login/" method="post">
        <!--<p class="form-group">-->
            <!--<label>用户名/手机/邮箱</label>-->
            <!--<input name="user" type="text" class="form-control">-->
        <!--</p>-->
        
        {% import 'macro.html' as macro %}
        {#调用宏模板#}
        {{macro.input('text', 'user', "用户名/手机/邮箱" )}}
        {{macro.input('password','passwd',  "密码" )}}

        <!--<p class="form-group">-->
            <!--<label>密码</label>-->
            <!--<input name="passwd" type="password" class="form-control">-->
        <!--</p>-->
        <p class="form-group">
            <button class="btn btn-primary btn-block" type="submit">登录</button>
        </p>
        <p class="form-group">
            <a href="#">忘记密码?</a>
        </p>
        <!--获取服务器传递给后台的变量message, jinja2模板引擎里面的语法-->
        {% if message %}
        <p style="color: red">{{ message }}</p>
        {% endif %}


    </form>
</p>
{% endblock %}
#主程序
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/login/')
def login():
    return render_template('login.html')

app.run()

2982924092-5bd130d6f192b_articlex.png

模板继承

Jinja2模板还有另一种代码复用技术,就是模板继承。当一个模板被另外的模板继承时,可以通过{{ super() }} 访问父模板的资源。在一个模板中继承另一个模板,需要extends 指令。如 child.txt 模板文件从 parent.txt 继承的代码

{% extends ‘parents.txt’ %}

child.txt 从parent.txt模板继承后,会自动使用parent.txt 中的所有代码,但要放在

{% block xxxx%} ....  {% endblock %}

中的代码需要child.txt中使用{{super() }}引用。其中,xxxx是块(block)的名字
模板继承语法:

1. 如何继承某个模板?
        {% extends "模板名称" %}


2. 如何挖坑和填坑?
挖坑:
    {% block 名称 %}

        默认值

    {% endblock %}


填坑:
    {% block 名称 %}

    {% endblock %}


3. 如何调用/继承被替代的模板?
挖坑:
    {% block 名称 %}

        默认值

    {% endblock %}


填坑:
    {% block 名称 %}
        #如何继承挖坑时的默认值?
        {{ super() }}

        # 后面写新加的方法.
        ........
    {% endblock %}
#templates目录下建立parent.html模板文件
<!DOCTYPE html>
<html lang="en">
<head>
    {% block head %}
    <meta charset="UTF-8">
    <title>{% block title %}hello{% endblock %}</title>
    {% endblock %}
</head>
<body>
I LOVE PYTHON! <br/>
{% block body %}
    Cute,{{ text }}
{% endblock %}

</body>
</html>
#templates目录下建立child.html模板文件
{% extends 'parent.html' %}
{% block title %}
{#继承挖坑时的默认值:{{ super() }}#}
{{ super() }}-{{ text }}
{% endblock %}

{% block body %}
<h1>{{ super() }},Beauty!</h1>
{% endblock %}
# 主程序
from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('child.html',text = 'sheen')

if __name__ == '__main__':
    app.run()

1311899705-5bd1310a8c152_articlex.png

相关文章

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

68

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

162

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

84

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

113

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

29

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

79

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

62

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

51

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 7.3万人学习

HTML+CSS基础与实战
HTML+CSS基础与实战

共132课时 | 12.3万人学习

前端开发(基础+实战项目合集)
前端开发(基础+实战项目合集)

共60课时 | 4.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号