flask的模板渲染

模板引擎传参

在视图函数中

  • render_template传参的时候以关键字实参进行传参。可以传多个,可以用**讲字典打散成关键字实参。

在模板中

  • jinja2模板引擎支持接收变量在用 {{}}包裹参数进行接收
  • 并且如果发现是字典,可以用.字典里面的key取出value值。也可以直接字典跟[]进行取值。
实例1(第一种传参方式):

目录结构

│ server.py
│
└─templates # 文件夹
        index.html

server.py

@app.route('/')
def index():
 
    return render_template('index.html',name="mark",age=18)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板传参</title>
</head>
<body>
    {{name}}
    {{age}}
</body>
</html>
实例2(第二种传参方式):

目录结构:同上

server.py

@app.route('/demo1/')
def demo1():
    context_dict = {"name":"mark",
               "age":"mark",
               "sex":"girl"}
 
    return render_template('index.html',context_dict = context_dict)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板传参</title>
</head>
<body>
    {{context_dict.name}}
    {{context_dict.age}}
    {{context_dict.sex}}
</body>
</html>
实例3(第三种传参方式):

目录结构:同上

server.py

def demo2():
    context_dict = {"name": "mark",
               "age": "mark",
               "sex": "girl",
                "other_info":{"tel":1365,
                               "qq":565656}}
 
    return render_template('index.html',**context_dict)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板传参</title>
</head>
<body>
    {{name}}
    {{age}}
    {{sex}}
    {{other_info.tel}}
    {{other_info["qq"]}}
</body>
</html>

模板中使用url_for()

在模板中如果有使用url的需求,我们可以直接手写一个url,也可以使用{{ url_for('视图函数名') }动态翻转一个url。

实例:

项目目录:

│ server.py
│
└─templates # 文件夹
        index.html
        info.html

server.py

@app.route('/')
def index():
 
    return render_template('index.html', name="mark", age=18)
 
 
@app.route('/info/')
def info():
 
    return render_template('info.html')

info.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>信息页面</title>
</head>
<body>
    <h1>这是信息页面</h1>
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板传参</title>
</head>
<body>
    <a href="/info/">正常跳转</a>
    <a href="{{ url_for('info') }}">urlfor跳转</a>
</body>
</html>

Markup转换变量中的特殊字符

在模板渲染中,使用Markup转换变量中的特殊字符,Markup对字符串进行转译处理再传递给render_template()函数

markup是在后台处理数据

from flask import Flask, render_template, Markup
 
app = Flask(__name__)
app.debug = True
 
def func1(arg, tank):
    # 在模板渲染中,使用Markup转换变量中的特殊字符,Markup对字符串进行转译处理再传递给render_template()函数
    # 前台可使用{{ ht1("json", "tank") }}进行传参
    return Markup(f"<h1>饼哥真帅,{arg} is sb {tank} is same as {arg}</h1>")
 
 
@app.route("/")
def index():
    return render_template("index.html", ht1=func1)
 
 
if __name__ == '__main__':
    app.run()
<body>
<h1>我是index页面</h1>
<table>
{{ ht1("jason", "tank") }}
</body>

safe将html生成安全的文本

safe是在前台处理数据

from flask import Flask, render_template, Markup
 
app = Flask(__name__)
app.debug = True
 
 
@app.route("/")
def index():
    # 前台想要解析ht标签,需要使用模板语法的safe,例如:{{ ht| safe }}
    return render_template("index.html", ht="<h1>饼哥真帅</h1>")
 
 
if __name__ == '__main__':
    app.run()
<body>
{{ ht|safe }}
</body>

jinja2中模板语法之for循环

for循环可以便利任何一个可迭代对象,包括列表、字典等,支持反向遍历

反向遍历实例

server.py{% for country in countrys %} 改为 {% for country in countrys|reverse %}

for循环常用变量表

for循环常用变量 功能描述
loop.index 当前循环的索引(从1开始)
loop.index0 当前循环的索引(从0开始)
loop.first 是否是第一次循环,是返回True,否则返回Flase
loop.last 是否是最后一次循环,是返回True,否则返回Flase
loop.length 总共可以循环的次数 / 迭代器的长度

for循环中的else用法

for还可以else分支语法,如果for内部没有遍历出来内容,那么就会走else分支,反之如果for循环遍历出了内容,则不会运行else分支。

注意:jinja2中的forelse逻辑不通于python在此不要类比python中的 forelse

{% for country in countrys|reverse %}
        <p>{{ country }}</p>
    {% else %}
        <p>没有值</p>
    {% endfor %}

示例代码:

from flask import Flask, render_template, Markup
 
app = Flask(__name__)
app.debug = True
 
 
USERS = {
    1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
    2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
    3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}
 
 
@app.route("/")
def index():
    return render_template("index.html", user=USERS)
 
 
if __name__ == '__main__':
    app.run()
<body>
<h1>我是index页面</h1>
<table>
    {% for k, v in user.items() %}
    <tr>
        <td>{{k}}</td>
        <td>{{v.name}}</td>
        <td>{{v['name']}}</td>
        <td>{{v.get('name')}}</td>
        <td>{{url_for('index')}}</td>
    </tr>
    {% endfor %}
</table>
</body>

jinja2模板语法之if语句

示例代码:

from flask import Flask, render_template, Markup
 
app = Flask(__name__)
app.debug = True
 
 
@app.route("/")
def index():
    return render_template("index.html", name="jason")
 
 
if __name__ == '__main__':
    app.run()
<body>
<h1>我是index页面</h1>
 
<div>{{name}}</div>
 
{% if name == "jason"%}
<h1>is sb</h1>
{% else %}
<h1>帅哥</h1>
{% endif %}
 
</body>
原文地址:https://www.cnblogs.com/cnhyk/p/12755934.html