Flask - Jinjia2

一、Jinjia2初级

Flask中默认的模板语言是Jinja2!

  1. 后端定义几个字符串,用于传递到前端:

    STUDENT = {'name': 'jiumo', 'age': 16, 'gender': '男'}
    
    STUDENT_LIST = [
        {'name': 'jiu', 'age': 17, 'gender': '中'},
        {'name': 'mo', 'age': 19, 'gender': '男'},
        {'name': 'wbw', 'age': 22, 'gender': '女'}
    ]
    
    STUDENT_DICT = {
        1: {'name': 'jiu', 'age': 17, 'gender': '中'},
        2: {'name': 'mo', 'age': 19, 'gender': '男'},
        3: {'name': 'wbw', 'age': 22, 'gender': '女'}
    }
  2. Jinja2模板中的控制流程

    • for

      {% for foo in g %}
      
      {% endfor %}
    • if

      {% if g %}
      
      {% elif g %}
      
      {% else %}
      
      {% endif %}
  3. Jinjia2传值

    • STUDENT_LIST 列表传递至前端(其他省略)

      @app.route("/student_list")
      def student_list():
          return render_template("student_list.html", student=STUDENT_LIST)
      <body>
      <div>{{ student }}</div>
      <table border="1xp">
          {% for foo in student %}
              <tr>
                  <td>{{ foo }}</td>
                  <td>{{ foo.name }}</td>
                  <td>{{ foo.get("age") }}</td>
                  <td>{{ foo["gender"] }}</td>
              </tr>
          {% endfor %}
      </table>
      </body>

      1450912-20190109212546014-1755814003.png

      补充

      # render_template中可以传递多个关键字
      @app.route("/allstudent")
      def all_student():
          return render_template("all_student.html", student=STUDENT ,
                                 student_list = STUDENT_LIST,
                                 student_dict= STUDENT_DICT)
      # 利用 **{}字典的方式传递参数
      @app.route("/allstudent")
      def all_student():
          return render_template("all_student.html", **{"student":STUDENT ,
                                 "student_list" : STUDENT_LIST,
                                 "student_dict": STUDENT_DICT})

二、jinjia2高阶用法

from flask import Flask
from flask import render_template

app = Flask(__name__)

@app.route("/")
def index():
    tag = "<input type='text' name='user' value='jiumo'>"
    return render_template("index.html",tag=tag)

app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ tag }}
</body>
</html>

直接运行结果:

1450912-20190109212053773-2067917845.png

似乎和我们想要结果不太一样,有两种解决方案

  1. safe: 前端
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ tag | safe}}  <!--  加上个 \  管道符,然后 safe  -->
</body>
</html>
  1. Markup: 后端
from flask import Flask
from flask import render_template
from flask import Markup  # 导入 flask 中的 Markup 模块

app = Flask(__name__)


@app.route("/")
def index():
    tag = "<input type='text' name='user' value='jiumo'>"
    markup_tag = Markup(tag)  # Markup帮助咱们在HTML的标签上做了一层封装,让Jinja2模板语言知道这是一个安全的HTML标签
    print(markup_tag,
          type(markup_tag))  # <input type='text' name='user' value='jiumo'> <class 'markupsafe.Markup'>
    return render_template("index.html", tag=markup_tag)

app.run(debug=True)

两种方法都会得到相同的结果:

1450912-20190109212155414-45055538.png

  1. Jinja2中执行Python函数(模板中执行函数)

    from flask import Flask
    from flask import render_template
    
    app = Flask(__name__)
    
    #定义一个函数,把它传递给前端
    def sum(a,b):
        return a+b
    
    @app.route("/")
    def index():
        return render_template("index.html", tag=sum)
    
    
    app.run(debug=True)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        {{ tag }}
        <br>
        {{ tag(99,1) }}
    </body>
    </html>

    1450912-20190109212231598-1733818927.png

    看到结果就是,函数加()执行得到结果

    • 还可以定义全局函数,无需后端传递给前端,Jinja2直接就可以执行的函数
    from flask import Flask
    from flask import render_template
    
    app = Flask(__name__)
    
    @app.template_global()  # 定义全局模板函数
    def a_b_sum(a, b):
        return a + b
    
    @app.template_filter()  # 定义全局模板函数
    def a_b_c_sum(a, b, c):
        return a + b + c
    
    @app.route("/")
    def index():
        return render_template("index.html", tag="")
    
    app.run(debug=True)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        {{ a_b_sum(99,1) }}
        <br>
        {{ 1 | a_b_c_sum(197,2) }}
    </body>
    </html>

    1450912-20190109212259433-1249820333.png

  2. 模板复用block

    如果我们前端页面有大量重复页面,没必要每次都写,可以使用模板复用的方式复用模板

-- index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Welcome JiuMo Cnblogs</h1>
    <h2>下面的内容是不一样的</h2>
    {% block content %}

    {% endblock %}
    <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
    <h1>wbw is Good</h1>
</body>
</html>

-- login.html

{% extends "index.html" %}
{% block content %}
    <form>
        用户名:<input type="text" name="user">
        密码:<input type="text" name="pwd">
    </form>
{% endblock %}

-- home.html


{% extends "index.html" %}
{% block content %}
    <h1>jiumo</h1>
{% endblock %}
from flask import Flask
from flask import render_template

app = Flask(__name__)

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

@app.route("/home")
def home():
    return render_template("home.html")

app.run("0.0.0.0", 5000, debug=True)

1450912-20190109212321853-1483038277.png

在这两个页面中,只有 block 中的内容发生了变化,其他的位置完全一样

  1. 模板语言的模块引用 include

    from flask import Flask
    from flask import render_template
    
    app = Flask(__name__)
    
    
    @app.route("/")
    def index():
        return render_template("index.html")
    
    
    app.run("0.0.0.0", 5000, debug=True)
    -- login.html
    
    <form>
        用户名:<input type="text" name="user">
        密码:<input type="text" name="pwd">
    </form>
    
    -- index.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>Welcome JiuMo Cnblogs</h1>
        <h2>下面的内容是不一样的</h2>
        {% include "login.html" %}
        <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
        <h1>wbw is Good</h1>
    </body>
    </html>
 ![](https://img2018.cnblogs.com/blog/1450912/201901/1450912-20190109212348539-1883452480.png)

  这就是将 login.html 当成一个模块,加载到 index.html 页面中

转载于:https://www.cnblogs.com/jiumo/p/10246946.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值