现在时间是:
当前位置:首 页 >> 网站开发>> 文章列表

Flask之jinjia

作者:   发布时间:2018-06-20 15:16:23   浏览次数:178

扩展阅读

Welcome | Jinja2 (The Python Template Engine)
欢迎来到 Jinja2 — Jinja2 2.7 documentation

Jinja

Jinja:是 Python 实现的模板语言。
模板语言:是一种被设计出来自动生成文档的简单文本格式。在模板语言中,一般都会把一些变量传给模板,来替换模板中特定位置上的预先自定义好的占位变量名。向相同的模板文件(HTML+Python)传入不同的变量,达到生成格式相同但内容不同的网页文件,这个生成的过程被称之为渲染

变量名

Jinja 中的变量名都会定义在 {{ variables }} 中,{{}} 被称之为变量代码块

<h1>{{ user.username }}</h1>
  • 1

变量代码块中可以是任意的 Python 对象或类型,唯一的条件就是 {{}} 中的变量必须能够被 Python 的 str() 内置方法转换成一个 String 类型对象。

注释

注释代码块使用 {# Documents #} 来表示。

控制语句

使用 {% controller_flow %} 来定义控制语句,{%%} 被称之为控制代码块,可以实现一些语言层次的功能。

if 语句

{% if user.is_logged_in() %}     <a href='/logout'>Logout</a> {% else %}     <a href='/login'>Login</a> {% endif %}
  • 1
  • 2
  • 3
  • 4
  • 5

循环

我们可以正常的循环迭代器或生成器函数。

  • NOTE 1:在 Jinja 中需要同时使用循环语句和 if 语句来模拟 continue 语句的功能。
{% for post in posts if post.text %}     <div>         <h1>{{ post.title }}</h1>         <p>{{ post.text | safe }}</p>     </div> {% endfor %}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • NOTE 2:可以使用 Jinja 提供的 loop 变量来模型 Python 中的 enumerate() 内置函数的功能。 loop 变量可以返回一些关于 for 循环的信息,EG. 索引号。
{% for post in posts %}     {{ loop.index }}-{{ post.title }} {% endfor %}
  • 1
  • 2
  • 3

过滤器

Jinja 过滤器实质上是 Jinja 提供的内置函数或自定义函数,这些内置函数与 Python 函数的类型,可以接收参数并返回结果。常用于处理变量代码块中的变量。在变量代码块中使用管道符 | 来调用。

无参数调用

{{ variable | filter_name }}
  • 1

带参数调用

{{ variables | filter_name(*args) }}
  • 1
  • NOTE 1:过滤器也可以在控制代码块 {%%} 中使用。
{% filter filter_name %}     codes {% endfilter %}
  • 1
  • 2
  • 3

这样的话就可以对控制代码块中的代码进行处理。

:会返回一个 Jinja 模板或 HTML 字符串。其最主要的功能就是提高代码的重用性,我们可以将一个会被反复使用到的模板或 HTML 文件写成一个宏,然后就像调用函数一般,不断的被重用。

定义宏

{% macro input(name, label, value='', type='text')%}     <div class="form-group">         <label for"{{ name }}">{{ label }}</div>         <input type="{{ type }}" name="{{ name }}"             value="{{ value | escape }}" class="form-control">     </div> {% endmacro %}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这是一个带有 label 标签变量的 Bootstrao VSS 输入框。

  • input():是宏的名字,类似于函数名
  • (name, label, value='', type='text'):是宏的参数,类似于函数的必备参数和缺省参数

调用宏

{{ input('name', 'Name') }}
  • 1

结果

    <div class="form-group">         <label for"name">Name</div>         <input type="text" name="name"             value="" class="form-control">     </div>
  • 1
  • 2
  • 3
  • 4
  • 5

实际上是想宏定义中的形参 name/label/value/type 传入实参 ‘name’/’Name’,其余的使用了缺省参数,而这些被传入的参数会替换 HTML 中的变量代码块。

兼容 JavaScript

如果希望将 JavaScript 代码和 Jinja 代码写在同一个模板文件中而不引起混淆(JavaScript 也含有 {{}} 语法),需要使用 raw 代码块来进行区分。

{% raw %} JavaScript statements {% endraw %}   

目录

前文列表

用 Flask 来写个轻博客 (1) — 创建项目
用 Flask 来写个轻博客 (2) — Hello World!
用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)
用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)
用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级
用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览

Jinja 中常用的过滤器

default

  • 如果传入变量代码块的值为 None,则传入默认值:

{{ post.date | default("2016-11-22") }}

  • 1
  • 若希望传入变量代码块的值为 False 时,使用默认值,可以将 True 传入 default 过滤器的第二个参数 。

{{ '' | default('String', True)}}

  • 1

float

将传入变量代码块中的值转换为浮点数,类似于 Python 的 float()

{{ 75 | float }}

  • 1

int

类似于 Python 的 int()

{{ 75.5 | int }}

  • 1

lenght

类似于 Python 中的 len()

The Count: {{ post.tags | lenght }}

  • 1

title

将传入变量代码块的 String 的首字母转换成大写,成为一个合格的 Title。

{{ "post title" | title }}

  • 1

round

类似于 Python 的 round() 定义浮点数的精度。

{{ 3.14159 | round(1) }}

  • 1
  • common 参数:四舍五入
  • floor 参数:截取整数部分
  • ceil 参数:向上取整

{{ 4.7 | rount(1, "common")}}

  • 1

join

将传入变量代码块的列表变量中的元素作为字符串连接起来,类似于 Python 的 join()

{{ ['JmilkFan', 'fanguiju' ] | join(',')}}

  • 1

tojson

过滤器 tojoin 实际上是调用了 Python 的 json.dumps 函数来序列化对象,一样的需要确保传入变量代码块的是一个可以被序列化的对象 Dict。

{{ {"key": "value" | tojson }}}

  • 1

如果我们采用将 SQLAlchemy models 的查询对象直接传入模板文件中进行渲染的方式来生成整个 HTML 页面时,我们就会常常使用到 tojson 过滤器,而且我们还需要将序列化后的结果进行 safe 处理,才能保证其安全性。

{{ posts | tojson | safe }}

  • 1

truncate

用于截取指定长度的 String 对象,并在截取后的子字符串后添加省略号。

{{ "a long stringggggggggggggggggg " | truncate(5) }}

  • 1

escape

如果传入变量代码块的是 HTML 字符串,则将该字符串中的 &、<、>、’、” 作为 HTML 的转义序列打印。

{{ "<h1>Title<h1>" | escape }}

  • 1

safe

safe 过滤器含有 escape 的功能,将传入到变量代码块中的 HTML 字符串中的特殊符号进行 HTML 转义,这是必要的安全手段
假如我们需要直接将 HTML 作为变量传入到变量代码块中,而且这个传入的接口是公开的话,我们就需要防止用户提交恶意的 HTML 代码。如果 Jinja 没有 HTML 转义功能的话,那么我们访问这个变量代码块的时候就会运行这些被提交的恶意 HTML 代码了。EG. 一个用户在回复框输入了含有 Script 标签的 HTML 代码,那么所有打开该页面的浏览器都会执行这些 Script。

但有一个问题就是:在有些情况下我们不应该对 HTML 进行转义且需要保证安全性的,对于这个问题,escape 过滤器是无法解决的。所以 Jinja 提供了 safe 过滤器。

{{ "<h1>Post Title"</h1> | safe }}

  • 1

自定义过滤器

在 Jinja 中自定义一个过滤器,有如编写一个 Python 函数。

  • 定义过滤器函数

def count_substring_from_python(string, sub): return string.count(sub)

  • 1
  • 2
  • 在 main.py 中声明过滤器函数

app.jinja_env.filters['count_substring'] = count_substring_from_python

  • 1
  • 在模板文件中调用自定义过滤器

{{ variable | filter_name("String") }}

  • 1

将过滤器函数 count_substring_from_python 映射成为过滤器 count_substring

Flask 的特殊变量和方法

这些 Flask 特殊的变量和方法,都是可以在模板文件中直接访问的。

config 对象

config 对象就是 Flask 的 config 对象,也就是 app.config 对象,其包含了 class DevConfig 的属性。

{{ config.SQLALCHEMY_DATABASE_URI }}

  • 1

request 对象

就是 Flask 中表示当前请求的 request 对象。

{{ request.url }}

  • 1

session 对象

就是 Flask 的 session 对象。

{{ session.new }}

  • 1

url_for 方法

url_for() 会返回传入的路由函数对应的 URL,所谓的路由函数就是被 app.route() 路由装饰器装饰的函数。EG. main.py 中的 home()。

{{ url_for('home') }}

  • 1
  • 如果我们定义的路由函数是带有参数的,EG. /post/1024,则可以将这些参数作为命名参数传入:

{{ url_for('post', post_id=1024) }}

  • 1

get_flashed_messages 方法

返回之前在 Flask 中通过 flash() 传入的信息列表,类似实现一个队列。EG. 把 Python String 对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages() 方法来逐一取出并消费掉。

{% for message in get_flashed_messages() %} {{ message }} {% endfor %}

  • 1
  • 2
  • 3

NOTE: 前提是该消息队列是由 flash() 来生成的。

 

 

https://blog.csdn.net/Jmilk/article/details/53765082







上一篇:没有了    下一篇:没有了

Copyright ©2018    易一网络科技|www.yeayee.com All Right Reserved.

技术支持:自助建站 | 领地网站建设 |短信接口 版权所有 © 2005-2018 lingw.net.粤ICP备16125321号 -5