zoukankan      html  css  js  c++  java
  • 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 页面中
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
  • 原文地址:https://www.cnblogs.com/jiumo/p/10246946.html
Copyright © 2011-2022 走看看