1. 变量表示

{{ argv }}

2. 赋值操作

{% set links = [
('home',url_for('.home')),
('service',url_for('.service')),
('about',url_for('.about')),
] %}

3. if判断

{% if not loop.first %}|{% endif %}

4. for 循环

{% for label,link in links %}
{% if not loop.first %}|{% endif %}
<a href="{{ link }}">{{ label }}</a>
{% endfor %} 

5. 定义测试函数

  上面 loop.first 就是一个测试函数,这个我们也可以自定义

  定义是在Sample.py 里定义的,current_link是HTML中可使用测试函数名称(可选)

@app.template_test('current_link')
def is_current_link(link):
return link == request.path

  HTML中,使用例子

<body>
{% set links = [
('home',url_for('.home')),
('service',url_for('.service')),
('about',url_for('.about')),
] %} <nav>
{% for label,link in links %}
{% if not loop.first %}|{% endif %}
<a href="{% if link is current_link %}#
{% else %}
{{ link }}
{% endif %}
">{{ label }}</a>
{% endfor %}
</nav>
</body>

---------------------------------------------分割线---------------------------------------------

6. 块block

  Flask强大的地方就可以引用模板,而且非常方便。

  这里不得不介绍block这个概念。

  模板的文件一般放在templates文件夹下,我们这里新建一个HTML文件,存放模板,'base.html'

  在这里面也,编排了整个页面的排版,里面会用到很多block的占位符

  每个block都代表一段html语句块,而这些块在哪里定义呢,可以在当前的base.html中定义,也可以在别的html中定义。反正要有一处定义,没有定义块只是没有效果而已

  定义的时候,home.html 顶部必须说明继承关系(如果py文件链接的是home.html,但home.html引用了base.html的模板,就要说明)

{% extends 'base.html' %}

  块的定义格式,endblock 后面块名可以省略,有时候加上会让结构更加明晰

{% block 块名 %}
块内容
{% endblock (块名)%}

  定义了块之后,base.html中对应的块,就会被这些块内容覆盖。

  • 块的覆盖情况

  有一种情况,base.html中定义了block B 块内容1,但是在home.html也定义block B 块内容2,注意这时会优先显示内容2,因为把内容1覆盖了。

理解起来,就是base.html是通用模板,我们可以直接引用过来,没有问题,但是也可以自定义块,修改通用模板的内容,达到我们想要的效果。

  还有一种情况,我们既不想不覆盖通用模板的内容,又想在其基础上,增加一些东西,这也是可以的。

  举个例子:在base.html

<footer>
{% block footer %}
<p>Posted:Bikmin</p>
<p>Contact with:<a href="someone@example.com">someone@example.com</a> </p>
{% endblock %}
</footer>

  如果我们不再自定义块,就会使用base.html通用模板的内容,效果如下

  

  觉得这个模板还行,不想覆盖,还想在这个基础上再添加些东西,想要上面添加一条水平线作为分隔符,该怎么做呢

  做法是,也是在home.html重新定义块,但是需要用到super()函数

{% block footer %}
<hr>
{{ super() }}
{% endblock %}

  {{ super() }} 就表示了通用模板里的内容

  在一个项目HTML中,块被定义多次,是会被覆盖的。

  有时候,我们想引用块的内容,又不想写一串很长的块内容,这时候可以用下面的语法,不管在哪个html文件里定义的都可以,只要有继承关系

{{ self.块名() }}

7. 包含页

  如果有一些HTML代码是经常用到的固定的,为了避免整个HTML文档看起来很拥挤,内容嘈杂。

可以将这一部分的代码,保存为了一个HTML模板,然后要用的时候,再用

{% include 'includes/_head.html' %}

包含的方法引用过来,引号里是路径,includes是templates下的一个文件夹,这个看你放在哪里,就填哪里的路径了。

8. 宏macro

  学了这么多,发现Flask中到处都是模板,仔细想想Python中的函数不也像是模板吗?只要输入参数,就可以实现特定的功能。

所以Jinjia里当然少不了。

  • 宏的定义(举个例子)

下面定义一个<input/>的函数,通过做成宏,可以将一些参数修改成我们想要的默认值,然后调用的时候就像函数一样调用,很方便。

{# 定义宏 #}
{% macro input(name,value='',type='text',size=20) %}
<input type="{{ type }}"
name="{{ name }}"
value="{{ value }}"
size="{{ size }}"/>
{% endmacro %}
  • 宏的调用
{{ input('username') }}
{{ input('password',type='password') }}
  • 宏的集合做成库

  宏跟函数差不多,Python的函数可以封装在库里,那么是不是也可以将很多宏集合在一起(一个HTML中),要用的时候像调用库函数一样import使用呢?

答案是当然可以的。这个做法还有一个好处,就是让我们的主HTML文件,内容更加简练。节省空间,可读性更强。

  下面我们举例将一个macro放在'_macro.html'中

然后如何引入到我们的文件里呢

{% import '_macro.html' as ui %}

这里注意,必须要加 as 库名 ,不然我们引用函数的时候,都不知道从哪里来的函数

调用的方式也有点改变,如下

{{ ui.input('username') }}
{{ ui.input('password',type='password') }}

  是不是跟Python的使用函数一模一样?

小项目实战

#Sample.py

# coding:utf-8
from flask import Flask,render_template,request,url_for app = Flask(__name__) @app.route('/')
def home():
return render_template('home.html',title_name = 'welcome') @app.route('/service')
def service():
return 'service' @app.route('/about')
def about():
return 'about' @app.template_test('current_link')
def is_current_link(link):
return link == request.path if __name__ == '__main__':
app.run(debug=True)

#home.html

{% extends 'base.html' %}
{% import '_macro.html' as ui %} {% block title %}{{ title_name }}{% endblock %} {% block content %}
{% set links = [
('home',url_for('.home')),
('service',url_for('.service')),
('about',url_for('.about')),
] %} <nav>
{% for label,link in links %}
{% if not loop.first %}|{% endif %}
<a href="{% if link is current_link %}#
{% else %}
{{ link }}
{% endif %}
">{{ label }}</a>
{% endfor %}
</nav>
<p>{{ self.title() }}</p>
{{ ui.input('username') }}
{{ ui.input('password',type='password') }}
{% endblock content %} {% block footer %}
<hr>
{{ super() }}
{% endblock %}

#base.html

<!DOCTYPE html>
<html lang="en">
<head>
{% block head %}
{% include 'includes/_head.html' %}
{% endblock %}
</head>
<body>
<header>{% block header %}{% endblock %}</header>
<div>{% block content %}<p>hello</p>{% endblock %}</div> {% for item in items %}
<li>{% block loop_item scoped %}{{ item }}{% endblock %}</li>
{% endfor %} <footer>
{% block footer %}
<p>Posted:Bikmin</p>
<p>Contact with:<a href="someone@example.com">someone@example.com</a> </p>
{% endblock %}
</footer>
</body>
</html>

#_head.html

<meta charset="UTF-8">
<link href="{{ url_for('static',filename='site.css') }}" rel="stylesheet">
<title>{% block title %}{% endblock %}</title>

#macro

{# 定义宏 #}
{% macro input(name,value='',type='text',size=20) %}
<input type="{{ type }}"
name="{{ name }}"
value="{{ value }}"
size="{{ size }}"/>
{% endmacro %}

运行项目

---------------------@@完成@@---------------------

Flask入门之Jinjia模板的一些语法的更多相关文章

  1. Flask:Jinjia模板

    Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能. 一.变量 1.1 手动传入的变量: 基本类型:{{ var }} 字 ...

  2. Flask入门系列(转载)

    一.入门系列: Flask入门系列(一)–Hello World 项目开发中,经常要写一些小系统来辅助,比如监控系统,配置系统等等.用传统的Java写,太笨重了,连PHP都嫌麻烦.一直在寻找一个轻量级 ...

  3. Flask入门模板Jinja2语法与函数(四)

    1 模板的创建 模板文件结构: project/ templates/ 模板文件 跳转模板一般使用: from flask import render_template,render_template ...

  4. Flask 的 template模板 与 jinja2语法

    Flask 的 template模板 与 jinja2语法 Flask使用的是Jinja2模板,所以其语法和Django基本无差别 1.模板基本数据的渲染 变量 {{..}} 列表 {% for it ...

  5. Flask入门很轻松(三)—— 模板

    Jinja2模板引擎 转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10959471.html Flask内置的模板语言,它的设计思想来源于 Dja ...

  6. Flask入门之自定义过滤器(匹配器)

    1.  动态路由的匹配器? 不知道这种叫啥名,啥用法,暂且叫做匹配器吧. Flask自带的匹配器可以说有四种吧(保守数字,就我学到的) 动态路由本身,可以传任何参数字符串或者数字,如:<user ...

  7. Flask入门和快速上手

    目录 Flask入门和快速上手 python三大主流框架对比 Flask安装 依赖 可选依赖 创建flask项目 flask最小应用--hello word 非法导入名称 调试模式 路由 唯一的 UR ...

  8. flask基础之jijia2模板语言进阶(三)

    前言 前面学习了jijia2模板语言的一些基础知识,接下来继续深挖jijia2语言的用法. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) 控制语句 和 ...

  9. flask基础之jijia2模板使用基础(二)

    前言 在以前前后端不分离的时代,后台程序员往往又当爹又当妈,需要将前端程序员写的h5页面填充模板语言.而jijia2是一门十分强大的python的模板语言,是flask框架的核心模块之一.先简单介绍一 ...

随机推荐

  1. iOS屏幕适配-iOS笔记

    学习目标 1.[了解]屏幕适配的发展史 2.[了解]autoResizing基本用法 3.[掌握]autoLayout 的基本用法 4.[掌握]autoLayout代码实现 5.[理解]sizeCla ...

  2. 【Unity Shaders】Diffuse Shading——创建一个自定义的diffuse lighting model(漫反射光照模型)

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  3. ValueError: setting an array element with a sequence.

    http://blog.csdn.net/pipisorry/article/details/48031035 From the code you showed us, the only thing ...

  4. How Many Processes Should Be Set For The Receiving Transaction Manager (RTM)

    In this Document   Goal   Solution   References APPLIES TO: Oracle Inventory Management - Version 10 ...

  5. Cocos2D物理碰撞不按预期工作的排查工作

    如果该碰撞的节点不碰撞或反过来不该碰的碰撞了,你可以检查一下几个方面: 1.对应2个节点的分类和掩码必须匹配.如果它们应该碰撞则一个节点的分类应该在另一个节点的掩码中,反之亦然. 2.注意空的分类和掩 ...

  6. MTK6577+Android之Camera驱动

    MTK6577+Android之Camera驱动 <MTK安卓平台的Camera效果在线调试> 1.     Camera拍照相关概念 1.1  ISP isp--(Image Signa ...

  7. 【57】android图片印刻,阳刻,素描图效果处理

    介绍我参与开发的妙趣剪纸app使用的图片处理相关的技术 关于妙趣剪纸,各大android商店都可以下载,下面贴出小米商店的链接 妙趣剪纸下载 软件效果截图 如何实现上面的图片处理效果呢 1.初始化高斯 ...

  8. 【51】java设计模式-工厂设计模式剖析

    工厂设计设计模式的分类: 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method) ...

  9. Cocoa练习01:一个简单的Todo list程序

    写一个简单的todo list程序,界面如下图: 在TextField区域输入文字,点击Add按钮会将文字显示在下面的TableView列表中.TableView列表有2列,第一列是文字的输入时间:第 ...

  10. C++之虚函数

    <span style="font-size:18px;">#include <iostream> using namespace std ; class ...