用Flask开发网站系列教程(二)——Jinja2模板

本文详细介绍了使用Flask框架配合Jinja2模板开发网站的方法,包括Jinja2和Marko模板引擎的特性比较,Flask如何渲染Jinja模板,以及模板中的属性访问规则、过滤器、控制语句、测试器、宏、模板继承、转义等核心概念。通过实例展示了如何在模板中使用变量、控制结构和导入宏,帮助开发者更好地理解和运用Jinja2模板。
摘要由CSDN通过智能技术生成

在之前的章节中,视图函数只是直接返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式和复杂逻辑的HTML代码,这可以让浏览器渲染出非常漂亮的页面。目前市面上有非常多的模板系统,其中最知名最好用的就是Jinja2和Mako,我们先来看一下这两个模板的特点和不同:

1.Jinja2:Jinja是日本寺庙的意思,并且寺庙的英文是temple和模板的英文template的发音类似。Jinja2是默认的仿Django模板的一个模板引擎,由Flask的作者开发。它速度快,被广泛使用,并且提供了可选的沙箱模板来保证执行环境的安全,它有以下优点:

2.让前端开发者和后端开发者工作分离。

3.减少Flask项目代码的耦合性,页面逻辑放在模板中,业务逻辑放在视图函数中,将页面逻辑和业务逻辑解耦有利于代码的维护。

4.提供了控制语句、继承等高级功能,减少开发的复杂度。

5.Marko:Marko是另一个知名的模板。他从Django、Jinja2等模板借鉴了很多语法和API,他有以下优点:

6.性能和Jinja2相近,在这里可以看到。

7.有大型网站在使用,有成功的案例。Reddit和豆瓣都在使用。

8.有知名的web框架支持。Pylons和Pyramid这两个web框架内置模板就是Mako。

9.支持在模板中写几乎原生的Python语法的代码,对Python工程师比较友好,开发效率高。

10.自带完整的缓存系统。当然也提供了非常好的扩展借口,很容易切换成其他的缓存系统。

Flask渲染Jinja模板:
要渲染一个模板,通过render_template方法即可,以下将用一个简单的例子进行讲解:

from flask import Flask,render_template
app = Flask(__name__)
@app.route('/about/')
def about():
  return render_template('about.html')

当访问/about/的时候,about()函数会在当前目录下的templates文件夹下寻找about.html模板文件。如果想更改模板文件地址,应该在创建app的时候,给Flask传递一个关键字参数template_folder,指定具体的路径,再看以下例子:

from flask import Flask,render_template
app = Flask(__name__,template_folder=r'C:\templates')
@app.route('/about/')
def about():
  return render_template('about.html')

以上例子将会在C盘的templates文件夹中寻找模板文件。还有最后一点是,如果模板文件中有参数需要传递,应该怎么传呢,我们再来看一个例子:

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

@app.route('/about/')
def about():
  # return render_template('about.html',user='xiaotuo')
  return render_template('about.html',**{
   'user':'xiaotuo})

以上例子介绍了两种传递参数的方式,因为render_template需要传递的是一个关键字参数,所以第一种方式是顺其自然的。但是当你的模板中要传递的参数过多的时候,把所有参数放在一个函数中显然不是一个好的选择,因此我们使用字典进行包装,并且加两个*号,来转换成关键字参数。

Jinja2:
Jinja2默认已经跟着Flask进行安装了,如果没有被安装到,可以通过pip install Jinja2来进行安装。

概要:
Jinja模板是简单的一个纯文本文件(html/xml/csv…),不仅仅是用来产生html文件,后缀名也依照你自己的心情而定。当然,尽量命名为模板正确的文件格式,增加可读性。先看一个简单例子:

1. <html lang="en">
2. <head>
3. <title>My Webpage</title>
4. </head>
5. <body>
6. <ul id="navigation">
7. {
   % for item in navigation %}
8. <li><a href="{
   { item.href }}">{
   {
    item.caption }}</a></li>
9. {
   % endfor %}
10. </ul>
11.
12. {
   {
    a_variable }}
13. {
   {
    user.name }}
14. {
   {
    user['name'] }}
15.
16. {
   # a comment #}
17. </body>
18.</html>

以上示例有需要进行解释:

第12~14行的{ { … }}:用来装载一个变量,模板渲染的时候,会把这个变量代表的值替换掉。并且可以间接访问一个变量的属性或者一个字典的key。关于点.号访问和[]中括号访问,没有任何区别,都可以访问属性和字典的值。

第7~9行的{% … %}:用来装载一个控制语句,以上装载的是for循环,以后只要是要用到控制语句的,就用{% … %}。

第14行的{# … #}:用来装载一个注释,模板渲染的时候会忽视这中间的值。

属性访问规则:
1.比如在模板中有一个变量这样使用&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值