Flask中默认的模板语言是Jinja2

首先我们要在后端定义几个字符串,用于传递到前端

  1. STUDENT = {'name': 'Old', 'age': , 'gender': '中'},
  2.  
  3. STUDENT_LIST = [
  4. {'name': 'gangdan', 'age': , 'gender': '中'},
  5. {'name': 'tiechui', 'age': , 'gender': '男'},
  6. {'name': 'xiaoming', 'age': , 'gender': '女'}
  7. ]
  8.  
  9. STUDENT_DICT = {
  10. : {'name': 'gangdan', 'age': , 'gender': '中'},
  11. : {'name': 'tiechui', 'age': , 'gender': '男'},
  12. : {'name': 'xiaoming', 'age': , 'gender': '女'},
  13. }

但是前提我们要知道Jinja2模板中的流程控制:

I. Jinja2模板语言中的 for

  1. {% for foo in g %}
  2.  
  3. {% endfor %}

II. Jinja2模板语言中的 if

  1. {% if g %}
  2.  
  3. {% elif g %}
  4.  
  5. {% else %}
  6.  
  7. {% endif %}

接下来,我们对这几种情况分别进行传递,并在前端显示成表格

1. 使用STUDENT字典传递至前端

后端:

  1. @app.route("/student")
  2. def index():
  3. return render_template("student.html", student=STUDENT)

前端:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Old Boy EDU</title>
  6. </head>
  7. <body>
  8. Welcome to Old Boy EDU
  9. <div>{{ student }}</div>
  10. <table border="1px">
  11. <tr>
  12. <td>{{ student.name }}</td>
  13. <td>{{ student["age"] }}</td>
  14. <td>{{ student.get("gender") }}</td>
  15. </tr>
  16. </table>
  17. </body>
  18. </html>

从这个例子中,可以看出来,字典传入前端Jinja2 模板语言中的取值操作, 与Python中的Dict操作极为相似,并且多了一个student.name的对象操作

2. STUDENT_LIST 列表传入前端Jinja2 模板的操作:

后端:

  1. @app.route("/student_list")
  2. def student_list():
  3. return render_template("student_list.html", student=STUDENT_LIST)

前端:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Old Boy EDU</title>
  6. </head>
  7. <body>
  8. <div>{{ student }}</div>
  9. <table border="1xp">
  10. {% for foo in student %}
  11. <tr>
  12. <td>{{ foo }}</td>
  13. <td>{{ foo.name }}</td>
  14. <td>{{ foo.get("age") }}</td>
  15. <td>{{ foo["gender"] }}</td>
  16. </tr>
  17. {% endfor %}
  18. </table>
  19. </body>
  20. </html>

这里我们可以看出如果是需要循环遍历的话,Jinja2 给我们的方案是

  1. {% for foo in student %}
  2. <tr>
  3. <td>{{ foo }}</td>
  4. </tr>
  5. {% endfor %}

上述代码中的 foo 就是列表中的每一个字典,再使用各种取值方式取出值即可

3.STUDENT_DICT 大字典传入前端 Jinja2 模板

后端:

  1. @app.route("/student_dict")
  2. def student_dict():
  3. return render_template("student_dict.html", student=STUDENT_DICT)

前端:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Old Boy EDU</title>
  6. </head>
  7. <body>
  8. <table>
  9. {% for foo in student %}
  10. <tr>
  11. <td>{{ foo }}</td>
  12. <td>{{ student.get(foo).name }}</td>
  13. <td>{{ student[foo].get("age") }}</td>
  14. <td>{{ student[foo]["gender"] }}</td>
  15. </tr>
  16. {% endfor %}
  17. </table>
  18. </body>
  19. </html>

在遍历字典的时候,foo 其实是相当于拿出了字典中的Key

4.结合所有的字符串儿全部专递前端Jinja2 模板

后端:

  1. @app.route("/allstudent")
  2. def all_student():
  3. return render_template("all_student.html", student=STUDENT ,
  4. student_list = STUDENT_LIST,
  5. student_dict= STUDENT_DICT)

前端:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Old Boy EDU</title>
  6. </head>
  7. <body>
  8. <div> _____________________________________</div>
  9. Welcome : student
  10. <div>{{ student }}</div>
  11. <table border="1px">
  12. <tr>
  13. <td>{{ student.name }}</td>
  14. <td>{{ student["age"] }}</td>
  15. <td>{{ student.get("gender") }}</td>
  16. </tr>
  17. </table>
  18. <div> _____________________________________</div>
  19. Welcome : student_list
  20. <div>{{ student_list }}</div>
  21. <table border="1xp">
  22. {% for foo in student_list %}
  23. <tr>
  24. <td>{{ foo }}</td>
  25. <td>{{ foo.name }}</td>
  26. <td>{{ foo.get("age") }}</td>
  27. <td>{{ foo["gender"] }}</td>
  28. </tr>
  29. {% endfor %}
  30. </table>
  31. <div> _____________________________________</div>
  32. Welcome : student_dict
  33. <div>{{ student_dict }}</div>
  34. <table border="1xp">
  35. {% for foo in student_dict %}
  36. <tr>
  37. <td>{{ foo }}</td>
  38. <td>{{ student_dict.get(foo).name }}</td>
  39. <td>{{ student_dict[foo].get("age") }}</td>
  40. <td>{{ student_dict[foo]["gender"] }}</td>
  41. </tr>
  42. {% endfor %}
  43. </table>
  44. </body>
  45. </html>

这里可以看出来,render_template中可以传递多个关键字

5.利用 **{}字典的方式传递参数

前端不变(标题4的前端代码)

后端:

  1. @app.route("/allstudent")
  2. def all_student():
  3. return render_template("all_student.html", **{"student":STUDENT ,
  4. "student_list" : STUDENT_LIST,
  5. "student_dict": STUDENT_DICT})

6. Jinja2 的高阶用法

Jinja2 模板语言为我们提供了很多功能接下来看一下它有什么高级的用法

6.1. safe : 此时你与HTML只差一个 safe

后端代码:

  1. from flask import Flask
  2. from flask import render_template
  3.  
  4. app = Flask(__name__)
  5.  
  6. @app.route("/")
  7. def index():
  8. tag = "<input type='text' name='user' value='username'>"
  9. return render_template("index.html",tag=tag)
  10.  
  11. app.run("0.0.0.0",5000)

前端代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. {{ tag }}
  9. </body>
  10. </html>

如果我们直接运行代码直接访问,你会在页面看到:就是字符创类型的标签

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

第一种,从前端入手

前端代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. {{ tag | safe}} <!-- 加上个 \ 管道符,然后 safe -->
  9. </body>
  10. </html>

还有一种方式是从后端入手

后端代码:

  1. from flask import Flask
  2. from flask import render_template
  3. from flask import Markup # 导入 flask 中的 Markup 模块
  4.  
  5. app = Flask(__name__)
  6.  
  7. @app.route("/")
  8. def index():
  9. tag = "<input type='text' name='user' value='DragonFire'>"
  10. markup_tag = Markup(tag) # Markup帮助咱们在HTML的标签上做了一层封装,让Jinja2模板语言知道这是一个安全的HTML标签
  11. print(markup_tag,
  12. type(markup_tag)) # <input type='text' name='user' value='username'> <class 'markupsafe.Markup'>
  13. return render_template("index.html", tag=markup_tag)
  14.  
  15. app.run("0.0.0.0", 5000, debug=True)

两种得到的效果是一样

6.2 在Jinja2中执行Python函数(模板中执行函数)

首先在文件中定义一个函数

后端代码:

  1. from flask import Flask
  2. from flask import render_template
  3. from flask import Markup # 导入 flask 中的 Markup 模块
  4.  
  5. app = Flask(__name__)
  6.  
  7. #定义一个函数,把它传递给前端
  8. def a_b_sum(a,b):
  9. return a+b
  10.  
  11. @app.route("/")
  12. def index():
  13. return render_template("index.html", tag=a_b_sum)
  14.  
  15. app.run("0.0.0.0", 5000, debug=True)

前端代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. {{ tag }}
  9. <br>
  10. {{ tag(99,1) }}
  11. </body>
  12. </html>

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

还可以定义全局函数,无需后端传递给前端,Jinja2直接就可以执行的函数

后端代码:

  1. from flask import Flask
  2. from flask import render_template
  3. from flask import Markup # 导入 flask 中的 Markup 模块
  4.  
  5. app = Flask(__name__)
  6.  
  7. @app.template_global() # 定义全局模板函数
  8. def a_b_sum(a, b):
  9. return a + b
  10.  
  11. @app.template_filter() # 定义全局模板函数
  12. def a_b_c_sum(a, b, c):
  13. return a + b + c
  14.  
  15. @app.route("/")
  16. def index():
  17. return render_template("index.html", tag="")
  18.  
  19. app.run("0.0.0.0", 5000, debug=True)

前端代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. {{ a_b_sum(99,1) }}
  9. <br>
  10. {{ 1 | a_b_c_sum(197,2) }}
  11. </body>
  12. </html>

两个函数的调用方式不太一样

尤其是@app.template_filter() 它的调用方式比较特别,这是两个Flask中的特殊装饰器

6.3 Jinja2模板复用 block

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

前端代码:

index.html 文件中的内容

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>Welcome OldboyEDU</h1>
  9. <h2>下面的内容是不一样的</h2>
  10. {% block content %}
  11.  
  12. {% endblock %}
  13. <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
  14.  
  15. </body>
  16. </html>

login.html 文件中的内容

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

home.html 文件中的内容

  1. {% extends "index.html" %}
  2. {% block content %}
  3. <h1>登陆成功</h1>
  4. {% endblock %}

后端代码:

  1. from flask import Flask
  2. from flask import render_template
  3.  
  4. app = Flask(__name__)
  5.  
  6. @app.route("/login")
  7. def login():
  8. return render_template("login.html")
  9.  
  10. @app.route("/home")
  11. def home():
  12. return render_template("home.html")
  13.  
  14. app.run("0.0.0.0", 5000, debug=True)

然后我们可以看到什么呢?

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

6.4 Jinja2模板语言的模块引用 include

login.html 文件中的内容:

  1. <form>
  2. 用户名:<input type="text" name="user">
  3. 密码:<input type="text" name="pwd">
  4. </form>

index.html 文件中的内容

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>Welcome OldboyEDU</h1>
  9. <h2>下面的内容是不一样的</h2>
  10. {% include "login.html" %}
  11. <h2>上面的内容是不一样的,但是下面的内容是一样的</h2>
  12. <h1>OldboyEDU is Good</h1>
  13. </body>
  14. </html>

后端代码:

 
  1. from flask import Flask
  2. from flask import render_template
  3.  
  4. app = Flask(__name__)
  5.  
  6. @app.route("/")
  7. def index():
  8. return render_template("index.html")
  9.  
  10. app.run("0.0.0.0", 5000, debug=True)

看到的结果

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

6.5 Jinja2模板语言中的宏定义

前端代码:

 
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8.  
  9. <h1>Welcome OldboyEDU</h1>
  10.  
  11. {% macro type_text(name,type) %}
  12. <input type="{{ type }}" name="{{ name }}" value="{{ name }}">
  13. {% endmacro %}
  14.  
  15. <h2>在下方是使用宏来生成input标签</h2>
  16.  
  17. {{ type_text("one","text") }}
  18. {{ type_text("two","text") }}
  19.  
  20. </body>
  21. </html>

宏定义一般情况下很少应用到,但是要知道有这么个概念

第四篇flask中模板语言 jinja2的更多相关文章

  1. Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  2. 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  3. 第四篇Django之模板语言

    Django之模板语言 一 模板的执行 模板的创建过程,对于模板,其实就是读取模板(其中嵌套着模板的标签),然后将Model中获取的数据插入到模板中,最后将信息返回给用户 def current_da ...

  4. python 全栈开发,Day119(Flask初识,Render Redirect HttpResponse,request,模板语言 Jinja2,用户登录例子,内置Session)

    一.Flask初识 首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 三大主流Web框架对比 ...

  5. Flask - 模板语言jinja2 和render_template高级用法

    目录 Flask - 模板语言jinja2 和render_template高级用法 一. 字典传递至前端 二. 列表传入前端Jinja2 模板的操作: 三. 大字典传入前端 Jinja2 模板 四. ...

  6. 第二篇 Flask 中的 Render Redirect HttpResponse

    第二篇 Flask 中的 Render Redirect HttpResponse   1.Flask中的HTTPResponse 在Flask 中的HttpResponse 在我们看来其实就是直接返 ...

  7. 第九篇 Flask 中的蓝图(BluePrint)

    第九篇 Flask 中的蓝图(BluePrint)   蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? ...

  8. 第三篇 Flask 中的 request

    第三篇 Flask 中的 request   每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前 ...

  9. flask 第四篇 模板语言jinja2

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

随机推荐

  1. Ubuntu最常见的包问题

    工作环境换成Ubuntu18.04小记:https://www.cnblogs.com/dunitian/p/9773214.html Ubuntu不得不说的就是这个apt出问题的处理 :(换源就不说 ...

  2. php+mysql+nginx+liunx 服务搭建

    安装php7相应的yum源   CentOS 7.x:   # rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7 ...

  3. Win10激活工具

    W10数字许可激活C#版v2.8.0百度网盘下载地址:https://pan.baidu.com/s/1TD0PVxIfB2NTarAuP9NJbQ直接下载地址:FTP://A@OS.X6X8.COM ...

  4. macOS卸载应用不彻底

    总觉得macOS卸载应用时直接移到废纸篓卸载不干净.配置文件根据Unix的习惯应该存放在用户目录下,还需要删除这些文件. ~/Library/Application Support/(应用程序名称) ...

  5. Codeforces 1037C Equalize

    原题 题目大意: 给你两个长度都为\(n\)的的\(01\)串\(a,b\),现在你可以对\(a\)串进行如下两种操作: 1.交换位置\(i\)和位置\(j\),代价为\(|i-j|\) 2.反转位置 ...

  6. Python读写文件的几种方式

    一.pandas pandas模块是数据分析的大杀器,它使得对于文件相关的操作变得简单. 看一下它的简单使用 import pandas as pd # 读取 df = pd.read_csv('al ...

  7. Hbase CMS GC 调优。

    export HBASE_OPTS="-XX:+UseConcMarkSweepGC" export HBASE_LOG_DIR=/app/hbase/logexport HBAS ...

  8. 金融量化分析【day111】:Matplotib-绘制K线图

    一.绘制k线图 1.使用金融包出错解决 1.错误代码 ImportError: No module named finance 2.解决办法 https://github.com/matplotlib ...

  9. LFYZ-OJ ID: 1010 天使的起誓

    思路 理解题目后,会发现是一个高精度除低精度求余问题,非常简单. 容易出错的地方是:求余结果为0的时候,此时,天使所在的盘子号码其实就是n,如果直接返回余数,得到的结果则是0. 被除数的范围是2-10 ...

  10. Mysql漏洞修复方法思路及注意事项

    [系统环境] 系统环境:Red Hat Enterprise Linux Server release 5.4 (Tikanga)  +  5.7.16 MySQL Community Server  ...