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 页面中
  • 相关阅读:
    今天开始用 VSU 2010
    Visual Studio 2010 模型设计工具 基本应用
    Asp.Net访问Oracle 数据库 执行SQL语句和调用存储过程
    Enterprise Library 4.1 Security Block 快速使用图文笔记
    解决“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本。”(图)
    一个Oracle存储过程示例
    Enterprise Library 4.1 Application Settings 快速使用图文笔记
    Oracle 10g for Windows 简体中文版的安装过程
    Oracle 11g for Windows 简体中文版的安装过程
    Oracle 9i 数据库 创建数据库 Net 配置 创建表 SQL查询 创建存储过程 (图)
  • 原文地址:https://www.cnblogs.com/jiumo/p/10246946.html
Copyright © 2011-2022 走看看