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调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
Python中的字符串操作和编码Unicode详解
Jan 18 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
python3使用matplotlib绘制条形图
Mar 25 Python
python的faker库用法
Nov 28 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
python多进程下的生产者和消费者模型
May 07 Python
Python urllib2运行过程原理解析
Jun 04 Python
学习Python爬虫的几点建议
Aug 05 Python
Python3中对json格式数据的分析处理
Jan 28 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
用PHP查询域名状态whois的类
2006/11/25 PHP
thinkphp判断访客为手机端或PC端的方法
2014/11/24 PHP
实现PHP搜索加分页
2016/10/12 PHP
PHP+Ajax异步带进度条上传文件实例
2016/11/01 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
轮播图组件js代码
2016/08/08 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
vuex的简单使用教程
2018/02/02 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
[01:39](回顾)各路豪强针锋相对,几经鏖战四强产生
2014/07/01 DOTA
Python3.2中的字符串函数学习总结
2015/04/23 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
解决Python print 输出文本显示 gbk 编码错误问题
2018/07/13 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
html5图片上传预览示例分享
2014/04/14 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
MaBelle玛贝尔香港官网:香港钻饰连锁店
2019/09/09 全球购物
我爱幼儿园演讲稿
2014/09/11 职场文书
纪检监察立案决定书
2015/06/24 职场文书
python本地文件服务器实例教程
2021/05/02 Python
浅谈JS的二进制家族
2021/05/09 Javascript