Flask 的 template模板 与 jinja2语法

Flask 的 template模板 与 jinja2语法

    Flask使用的是Jinja2模板,所以其语法和Django基本无差别

1、模板基本数据的渲染

变量 {{..}}
列表 {% for item in List %}<li>{{item}}</li>{% endfor %}
字典 {% for k,v in Dict.items() %}<li>{{k}}{{v}}</li>{% endfor %}

2 注意:Markup等价django的mark_safe 用于返回有效的html标签

    也可以像django一样使用 {{data|safe}}

3 像django的simple_tag, filter 一样,传递自定义的函数

局部函数 -- 只能在传入的template中使用,直接定义,传递

      def add_num(a,b):
        return int(a) + int(b)

    返回时:
        return render_template('..html','add_num':add_num)

    使用:
        {{add_num(1,2)}}

全局  -- 全局使用

    django 的 filter可以当做if条件

    需要 @app.template_global()装饰器
         def func(a,b,c)  --->>  全局temlate使用 {{func(a,b,c)}}

      和 @app.template_filter()装饰器
         def func(a,b,c)  --->>  全局temlate使用 {{a|filter(b,c)}}  # 需要管道符

4 模板继承

{% extends 'layout.html' %}
{% block body %}
{% endblock %}

{% include 'asd.html' %}

5 定义宏: 相当于定义函数来控制html的内容

 一般是用于多次会用到的地方,比如分页

在需要重用的html中写,paginator.html:

{% macro page(data,url) -%}

    {% if data %}
        <ul class="pagination pagination-sm no-margin">
            <li><a href="{{ url_for(url,page=1) }}">首页</a></li>

            {% if data.has_prev %}
            <li><a href="{{ url_for(url,page=data.prev_num) }}">上一页</a></li>
            {% else %}
            <li class="disabled"><a href="">上一页</a></li>
            {% endif %}

            {% for v in data.iter_pages() %}
                {% if v == data.page %}
                <li class="active"><a href="{{ url_for(url,page=v) }}">{{ v }}</a></li>
                {% else %}
                <li><a href="{{ url_for(url,page=v) }}">{{ v }}</a></li>
                {% endif %}

            {% endfor %}

            {% if data.has_next %}
            <li><a href="{{ url_for(url,page=data.next_num) }}">下一页</a></li>
            {% else %}
            <li class="disabled"><a href="">下一页</a></li>
            {% endif %}
            <li><a href="{{ url_for(url,page=data.pages) }}">尾页</a></li>
        </ul>
    {% endif %}

{%- endmacro  %}    

调用:

{% import 'admin/paginator.html' as pg %}
{{ pg.page(page_data,'admin.tag_list') }}

例子:

视图中:

from flask import Flask,redirect,Markup,render_template,make_response
app = Flask(__name__)

    # 全局使用
@app.template_filter()
def Filter(a,b,c):
    return min(a,b,c)

    # 全局使用
@app.template_global()
def Global(a,b,c):
    return a + b + c

    # 自定义函数 -- 局部
def add_num(a,b):
    return int(a) + int(b)

@app.route('/index',endpoint='index',methods=['GET'])
def index():

    Dict = {
        'List':[1,2,3],
        'Dict':{'amy':18,'bob':20},
        'Str':'hello',
        'add_num':add_num,
        'tag':Markup('<a href="#">点击</a>')  # 或者在templates中使用 |safe
    }

    response = make_response(render_template('index.html',**Dict))
    return response

if __name__ == '__main__':
    app.run()

html中:

<p>hello!</p>

<p>字符串:{{Str}}</p>

<ul>
列表:
    {% for item in List %}
    <li>
        {{item}}
    </li>
    {% endfor %}
字典:
    {% for k,v in Dict.items() %}
    <li>
        {{k}}{{v}}
    </li>
    {% endfor %}
</ul>

<p>自定义加法函数:{{add_num(1,4)}}</p>
<p>全局函数global:{{Global(1,4,5)}}</p>
<p>全局函数filter:{{1|Filter(1,4)}}</p>

html标签:{{tag}}

输出结果

原文地址:https://www.cnblogs.com/big-handsome-guy/p/8541363.html

时间: 2024-07-30 07:50:23

Flask 的 template模板 与 jinja2语法的相关文章

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

是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符串,用于传递到前端 STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'}, STUDENT_LIST = [ {'name': 'Old', 'age': 38, 'gender': '中'}, {'name': 'Boy', 'age': 73,

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

是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符串,用于传递到前端 STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'}, STUDENT_LIST = [ {'name': 'Old', 'age': 38, 'gender': '中'}, {'name': 'Boy', 'age': 73,

Flask中的模板语言Jinja2及render_template

Flask中默认的模板语言是Jinja2 在学习Jinja2前render_template中留下的问题解决 1.首先我们要在后端定义几个字符串,用于传递到前端 STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'} STUDENT_LIST = [ {'name': 'wahaha', 'age': 18, 'gender': '男'}, {'name': 'heihei', 'age':50, 'gender': '中'}, {'name':

3,Flask 中的模板语言 Jinja2 及 render_template 的深度用法

Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符串,用于传递到前端 STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'}, STUDENT_LIST = [ {'name': 'Old', 'age': 38, 'gender': '中'}, {'name': 'Boy', 'age': 73, 'gender': '

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

是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符串,用于传递到前端 STUDENT = {'name': 'Old', 'age': 38, 'gender': '中'}, STUDENT_LIST = [ {'name': 'Old', 'age': 38, 'gender': '中'}, {'name': 'Boy', 'age': 73,

Flask Web Development - Flask 模板1 - 模板机制&Jinja2引擎

节选自PartI Chapter3,这个chapter主要讲模板工作原理,这里讲的就是Jinja2这个模板,另外还提到了Flask-Bootstrap及Flask-Moment两个插件,前者对Flask使用Bootstrap做了些封装,后者对moment.js做了些封装.内容较多,估计分开搞. 模板存在的意义 可维护性高的代码是结构良好且整洁的. 当用户在网站注册一个账户时,他在表单里填入邮箱跟密码,并点击提交按钮.在server端就收到一个包含这些数据的request,再由Flask分发到相应

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

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

ansible的playbook配置及template模板的使用

前言: 学习下ansible的playbooks的状态配置管理,说来puppet saltstack都有类似的叫法,只是ansible的叫法更犀利,我当时一看playbook还以为是花花公子的playboy.要使用ansible就要深入学习playbook配置及模板. 注:到底是playbook还是playbooks.... 先把官网的简单几个语法给说明下. #这个是你选择的主机 - hosts: webservers #这个是变量   vars:     http_port: 80     m

c++模板的一些语法

函数模板的特化 template <class T> int compare(T v1,T v2) { if(v1<v2) return -1; else if(v1>v2) return 1; else return 0; } template <> int compare<char *>(char * s1,char * s2) { return strcmp(s1,s2); } 类模板的特化 template <class T> class