【Flask模版语言Jinja2】 -- 2019-08-07 10:37:14

目录

  • 流程控制
  • 模版语言转义
  • 在模版中使用Python函数
  • Jinja2模版复用之block
  • Jinja2模版引用之include
  • Jinja2模板宏定义之macro

原创: http://106.13.73.98/__/26/

@(Jinja2模版语言)
***
补充,导入静态文件:

<link rel="stylesheet" href="{{ url_for('static', filename='css/clock.css') }}">

Falsk中默认的模版语言是Jinja2
{{}} 引用或执行时使用
{%%} 逻辑使用

流程控制

for语法

{% for foo in g %}
    # 逻辑...
{% endfor %}

if语法

{% if g %}

{% elif g %}

{% else %}

{% endif %}

开始测试
***
我们先准备好后端代码:

from flask import Flask, render_template

app = Flask(__name__)

info = {
    1: {'name': '张三', 'age': '30', 'gender': '男'},
    2: {'name': '李四', 'age': '40', 'gender': '女'},
    3: {'name': '王五', 'age': '50', 'gender': '未知'},
}

@app.route('/')
def test():
    return render_template('test.html', info=info)
  # 还可以使用下面这种方式传递字典:
  # return render_template('test.html', **{'info': info})
app.run('0.0.0.0', 5000, debug=True)

开始写前端:

<table border="1px">
    <thead>
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
    </tr>
    </thead>
    <tbody>
    {% for k in info %} {# 循环字典还可用keys, values, items方法 #}
        <tr>
            <td>{{ k }}</td>
            <td>{{ info.get(k).name }}</td>
            <td>{{ info[k].get('age') }}</td>
            <td>
                {% if info[k]['gender'] == '未知' %}
                    男
                {% else %}
                    {{ info[k]['gender'] }}
                {% endif %}
            </td>
        </tr>
    {% endfor %}
    </tbody>
</table>

展示效果如下图:


模版语言转义

安全起见,默认传入前端的字符串不会被转义.

从后端入手——Markup
***
后端代码:

from flask import Flask, render_template, Markup

app = Flask(__name__)

@app.route('/')
def test():
    tag = '<label><input type="text" value="我将被转义"></label>'
    # 受用Markup在HTML标签上做一层封装,当Jinja2模版语言知道这是一个安全的HTML标签
    ret = Markup(tag)
    return render_template('test.html', ret=ret)

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

前端代码:

{{ ret }}

实现效果:

从前端入手——safe
***
后端代码:

from flask import Flask, render_template, Markup

app = Flask(__name__)

@app.route('/')
def test():
    tag = '<label><input type="text" value="我将被转义"></label>'
    return render_template('test.html', tag=tag)

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

前端代码:

{{ tag|safe }}

好了,去访问验证吧.
***

在模版中使用Python函数

方法一:使用template_global定义全局函数
***
前端代码:

from flask import Flask, render_template

app = Flask(__name__)

@app.template_global()  # 定义全局模版函数
def axb(a, b):
    return a * b

@app.route('/')
def test():
    return render_template('test.html')

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

前端代码:

{{ axb(10, 10) }}

方法二:将函数传给前端
***
后端代码:

from flask import Flask, render_template

app = Flask(__name__)

axb = lambda a, b: a * b

@app.route('/')
def test():
    return render_template('test.html', axb=axb)

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

前端代码:

{{ axb(10, 10) }}


Jinja2模版复用之block

首先要定义一个母版文件index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>此处省略800行</div>
    {% block content %}

    {% endblock %}
    <div>此处省略800行</div>
</body>
</html>

然后在其它HTML文件中引用它:

{% extends "index.html" %}
{% block content %}
<div>此处省略800行</div>
{% endblock %}


Jinja2模版引用之include

先定义一个代码块:

<form>
    用户名:<input type="text" name="user">
    密码:<input type="password" name="pwd">
</form>

然后在其它HTML文件中引用它:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>此处省略800行</div>
    {% include "login.html" %}
    <div>此处省略800行</div>
</body>
</html>


Jinja2模板宏定义之macro

宏定义一般很少用.

前端代码:

<body>
{# 先定义一个函数 #}
{% macro type_text(type, name) %}
    <input type="{{ type }}" name="{{ name }}" value="{{ name }}">
{% endmacro %}

{# 调用函数 #}
{{ type_text('text', 'username') }}
{{ type_text('password', 'userpwd') }}
</body>

展示效果如下:

原创: http://106.13.73.98/__/26/

原文地址:https://www.cnblogs.com/gqy02/p/11313788.html

时间: 2024-10-08 17:30:07

【Flask模版语言Jinja2】 -- 2019-08-07 10:37:14的相关文章

【Flask模版语言Jinja2】 &#565429;

目录 流程控制 模版语言转义 在模版中使用Python函数 Jinja2模版复用之block Jinja2模版引用之include Jinja2模板宏定义之macro 原文: http://blog.gqylpy.com/gqy/335 "@(Jinja2模版语言) *** 补充,导入静态文件: <link rel="stylesheet" href="{{ url_for('static', filename='css/clock.css') }}"

2019.08.07学习整理

2019.08.07学习整理 字符编码 1.什么是字符编码 字符编码是将人类的字符编码成计算机能识别的数字,这种转换必须遵循一套固定的标准,该标准无非是人类字符与数字的对应关系,称之为字符编码表. 2.字符编码发展史与分类 计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系.最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号. 当然我们编程语言都用英文没问题,ASCII够用,但是在处理数据

9 模版语言 jinja2

from flask import Flask,redirect,render_template,jsonify,send_file,request,Markup,sessionimport jsonfrom datetime import timedeltaapp = Flask(__name__) #模版支持get 点 索引[]方式获取值 def jinja22(): #模版支持get 点 索引[]方式获取值 name = [{'test':'dell','age':'222','city'

网站后端_Python+Flask.0014.FLASK模版相关之使用JinJa2模版渲染?

简单 说明: 说明:  之前章节中,视图函数直接返回文本,而实际生产环境很少这样,因为实际的页面大多是带有样式和复杂逻辑的HTML+CSS+JS代码,这可以让浏览器渲染出非常漂亮和复杂的效果,页面内容应该是可以重用的,而且需要更执行更高级的功能 自带 模版: #!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: limanman # OsChina: http://xmdevops.blog.51cto.

模版语言 实现瀑布流页面

模板 1.模版的执行 模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户. def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)

第一期周二航拍视频分享 2017/07/10

2017/07/10 分享方式:1.讲解航拍镜头语言 2.以一个经典视频为例讲解其中所用到的航拍语言  3.最后再看一个视频,同时大脑应思考视频中出现的镜头语言 1.讲解航拍镜头语言 航拍基本动作 直飞 1.直线向前飞,镜头向前: 这是最常用的手法之一,一般拍摄海岸线.沙漠.山脊.笔直的道路等等也多用这种手法. 画面中镜头向前移动,也可从地面慢慢抬头望向远处,镜头一气呵成. 2.直线向前飞,镜头俯瞰: 正俯的镜头常用于拍摄城市.森林,特别是一条笔直的路.一排整齐的车辆,树,房子等等. 直线向前飞

Bentley STAAD.Pro V8i (SELECTSeries 5) 20.07.10.64 1CD

TecnoMETAL BIM Suite 2015 for AutoCAD 2014-2015 Win64 1CD钢结构设计软件TecnoMETAL套件允许用户使用交互和有用特性的组合钢结构的设计和更低的价格不是单独的软件.TecnoMETAL套件中可用4版本每个致力于一个特定的专业需求.TecnoMETAL BIM套件标准 AutoCAD应用软件致力于2 d绘图和检查钢结构的连接.TecnoMETAL BIM套件高端设计版 AutoCAD应用软件致力于2 d和3 d绘图和检查钢结构的连接.TE

Django模版语言

Django模版语言 常用语法 只需要记两种特殊符号: {{ }}和{% %} 变量相关的用{{}},逻辑相关的用{% %} 变量 {{ name }} --->变量 变量名由字母数字和下划线组成. 点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值. 例子: view中的代码: def template_test(request): l = [11, 22, 33] d = {"name": "alex"} class Person(object):

Django模版语言的复用 1. include标签--模版导入 2.inclusion_tag自定义标签--模版导入 3.母版

include标签--模版导入 ''' 前提:项目中,往往会出现多个页面拥有一个或几个相同的页面版块,或是一个页面多个页面版块是相同的 如何运用:可以将多个样式标签的集合进行封装,对外提供版块的名字(接口),在有该版块的页面中直接导入即可 语法:{% include '版块页面的路径' %} ''' 公共的页面版块 <!-- templates/public.html --> <!-- 该页面位公共的页面代码块,所以不需要完整的html页面结构 --> <div class=