• Flask


    一、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>
        

        补充

        # 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>
    

    直接运行结果:

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

    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)
    

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

    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>
      

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

      • 还可以定义全局函数,无需后端传递给前端,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>
      

    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)
    

    在这两个页面中,只有 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 页面中
  • 相关阅读:
    在redhat 6.6上安装Docker
    Linux操作系统各版本ISO镜像下载(包括oracle linux edhatcentosu
    UML时序图(Sequence Diagram)学习笔记
    eureka 和zookeeper 区别 优势【转】
    HttpClient实现远程调用
    Java 1.8 Stream 用例测试
    ZooKeeper下载安装(Windows版本)
    Java1.8新特性
    mysql大数据量表索引与非索引对比
    druid监控mysql程序
  • 原文地址:https://www.cnblogs.com/jiumo/p/10246946.html
Copyright © 2020-2023  润新知