首页 > 其他分享 >Flask学习笔记(三)-jinja2 模板入门

Flask学习笔记(三)-jinja2 模板入门

时间:2022-09-26 19:13:46浏览次数:72  
标签:__ name Flask app flask html jinja2 模板

一、表达式

jinja2是一个被广泛使用的模板引擎,其设计思想源自于django模板引擎,jinja2扩展了语法,增加了强大的功能,被flask选为内置的模板语言

示例的目录结构如下

./
├── app.py
└── templates
    └── name1.html

 html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>欢迎你 {{ name }} </p>
</body>
</html>  

flask请求: 

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

@app.route('/name/<string:name>',methods=['GET'])
def name(name):
    return render_template("name1.html", name=name)

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

启动服务,在浏览器里输入 http://127.0.0.1:5000/name/小风测试

二、flask模板---if语句

 示例:

if.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% if name=='管理员' %}
    <p>原来你是管理员啊</p>
    {% else %}
    <p>欢迎你 {{ name }}</p>
    {% endif %}
</body>
</html>

flask请求:

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


@app.route('/if/<string:name>',methods=['GET'])
def test_if(name):
    return render_template('if.html',name=name)


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

启动服务后,在浏览器里输入 http://127.0.0.1:5000/if/小明

页面里会显示

欢迎你 小明

但如果你在浏览器里输入 http://127.0.0.1:5000/if/管理员

页面里则会显示

原来你是管理员啊

两个条件分支无法满足业务需求,你也可以使用 {% elif %} 增加逻辑判断  

三、flask模板---for 语句

语法

jinja2 模板中,使用  {% 语句 %}  包围的语法块称为语句,jinja2 支持类似于 Python 的 for 循环语句,语法如下:

示例:

for.html文件  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Members</h1>
    <ul>
    {% for user in users %}
      <li>{{ user }}</li>
    {% endfor %}
    </ul>
</body>
</html>

flask请求:

from flask import Flask, render_template
app = Flask(__name__)
users = ['张三', '王五', '刘麻子']

@app.route('/users/3')
def for_test():
    return render_template('for.html', users=users)

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

启动服务后,在浏览器里输入 http://127.0.0.1:5000/users/3

四、flask模板---模板继承(extends)

对于模板内容重复的问题,Jinja2 提供了模板继承的支持。我们可以定义一个父模板,一般会称之为基模板(base template)。基模板中包含完整的 HTML 结构和导航栏、页首、页脚都通用部分。在子模板里,我们可以使用 extends 标签来声明继承自某个基模板。基模板中需要在实际的子模板中追加或重写的部分则可以定义成块(block)。块使用block 标签创建, {% block 块名称 %} 作为开始标记,{% endblock %} 或 {% endblock 块名称 %} 作为结束标记

示例的目录结构如下

./
├── app.py
└── templates
    └── base.html
    └── news.html

base.html代码如下: 

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <!--预留插入标题位置-->
    <title>
        {% block title %}
        {% endblock %}
    </title>
</head>
<body>
    <!--导航,内容固定-->
    <ul>
        <li>
            <a href="#">首页</a>
            <a href="#">新闻中心</a>
            <a href="#">产品中心</a>
            <a href="#">联系我们</a>
        </li>
    </ul>
    <!--预留插入网页内容部分-->
    {% block content %}
    {% endblock %}
</body>
</html>

news.html继承base.html自动生成固定部分,我们仅仅需要在news.html中完善预留插入位置的内容。

{% extends 'base.html' %}
<!--插入到block title位置-->
{% block title %}
新闻中心
{% endblock %}
<!--插入到block content-->
{% block content %}
<h1>新闻中心</h1>
<p>
    这里是新闻中心页面
</p>
{% endblock %}

flask请求(app.py):  

from flask import Flask, render_template
app = Flask(__name__)
@app.route('/news')
def news():
    return render_template('news.html')
if __name__ == '__main__':
    app.run(debug=True)

启动服务后,在浏览器里输入http://127.0.0.1:5000/news 

效果如下:

五、flask模板---行语句

flask行语句,可以让模板的代码编写更加容易便捷,不然总是用{% ... %} 来标识挺麻烦的, 使用行语句首先需要进行设置(app.py进行设置)

app.jinja_env.line_statement_prefix = '#'

先来看一下不使用行语句时如何写一段for循环

{% for i in range(10) %}
    <p>{{ i }}</p>
{% endfor %}

而一旦开启了行语句,你就可以这样写了

# for i in range(10):
    <p>{{ i }}</p>
# endfor

我已经设置了行语句的前缀为# ,在模板里,只要一行代码里去掉前面的空白符后是以# 开头的,就视为行语句。

行语句的代码和我们平时写python代码一样,不用那么麻烦的用{% 和 %} 进行标记了。

若有未闭合的圆括号、花括号或方括号,行语句可以跨越多行:

<ul>
# for href, caption in [('index.html', 'Index'),
                        ('about.html', 'About')]:
    <li><a href="{{ href }}">{{ caption }}</a></li>
# endfor
</ul> 

 

 

 

 

  

 

 

 

  

标签:__,name,Flask,app,flask,html,jinja2,模板
From: https://www.cnblogs.com/xfbk/p/16727021.html

相关文章