Flask框架Jinjia模板常用语法总结


Posted in Python onJuly 19, 2018

本文实例总结了Flask框架Jinjia模板常用语法。分享给大家供大家参考,具体如下:

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 }}" rel="external nofollow" >{{ 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>

Flask框架Jinjia模板常用语法总结

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" rel="external nofollow" rel="external nofollow" >someone@example.com</a> </p>
  {% endblock %}
</footer>

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

Flask框架Jinjia模板常用语法总结

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

做法是,也是在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" rel="external nofollow" rel="external nofollow" >someone@example.com</a> </p>
    {% endblock %}
  </footer>
</body>
</html>

#_head.html

<meta charset="UTF-8">
<link href="{{ url_for('static',filename='site.css') }}" rel="external nofollow" 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模板常用语法总结

更多关于Python相关内容可查看本站专题:《Python入门与进阶经典教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python网络编程学习笔记(五):socket的一些补充
Jun 09 Python
基于python yield机制的异步操作同步化编程模型
Mar 18 Python
Python计算字符宽度的方法
Jun 14 Python
解决python opencv无法显示图片的问题
Oct 28 Python
对python文件读写的缓冲行为详解
Feb 13 Python
python opencv 批量改变图片的尺寸大小的方法
Jun 28 Python
使用python实现滑动验证码功能
Aug 05 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
使用Django实现把两个模型类的数据聚合在一起
Mar 28 Python
Python Tornado之跨域请求与Options请求方式
Mar 28 Python
python urllib和urllib3知识点总结
Feb 08 Python
LeetCode189轮转数组python示例
Aug 05 Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 #Python
python代码过长的换行方法
Jul 19 #Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 #Python
python多行字符串拼接使用小括号的方法
Mar 19 #Python
python中的字符串内部换行方法
Jul 19 #Python
flask框架视图函数用法示例
Jul 19 #Python
Python中的单行、多行、中文注释方法
Jul 19 #Python
You might like
JAVA/JSP学习系列之二
2006/10/09 PHP
php实现插入排序
2015/03/29 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
JS location几个方法小姐
2008/07/09 Javascript
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
jquery UI 1.72 之datepicker
2009/12/29 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
[01:11]回顾历届DOTA2国际邀请赛中国区预选赛
2017/06/26 DOTA
Python异常的检测和处理方法
2018/10/26 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
Flask之请求钩子的实现
2018/12/23 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
应届生妇产科护士求职信
2013/10/27 职场文书
信息专业大学生自我评价分享
2014/01/17 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
教师岗位职责
2015/02/03 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书