用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法

简介: 目录目录前文列表Jinja 中常用的过滤器defaultfloatintlenghttitleroundjointojsontruncateescapesafe自定义过滤器Flask 的特殊变量和方法config 对象req...

目录

前文列表

用 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") }}
  • 若希望传入变量代码块的值为 False 时,使用默认值,可以将 True 传入 default 过滤器的第二个参数 。
{{ '' | default('String', True)}}

float

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

{{ 75 | float }}

int

类似于 Python 的 int()

{{ 75.5 | int }}

lenght

类似于 Python 中的 len()

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

title

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

{{ "post title" | title }}

round

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

{{ 3.14159 | round(1) }}
  • common 参数:四舍五入
  • floor 参数:截取整数部分
  • ceil 参数:向上取整
{{ 4.7 | rount(1, "common")}}

join

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

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

tojson

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

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

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

{{ posts | tojson | safe }}

truncate

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

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

escape

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

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

safe

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

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

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

自定义过滤器

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

  • 定义过滤器函数
def count_substring_from_python(string, sub):
    return string.count(sub)
  • 在 main.py 中声明过滤器函数
app.jinja_env.filters['count_substring'] = count_substring_from_python
  • 在模板文件中调用自定义过滤器
{{ variable | filter_name("String") }}

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

Flask 的特殊变量和方法

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

config 对象

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

{{ config.SQLALCHEMY_DATABASE_URI }}

request 对象

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

{{ request.url }}

session 对象

就是 Flask 的 session 对象。

{{ session.new }}

url_for 方法

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

{{ url_for('home') }}
  • 如果我们定义的路由函数是带有参数的,EG. /post/1024,则可以将这些参数作为命名参数传入:
{{ url_for('post', post_id=1024) }}  

get_flashed_messages 方法

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

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

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

相关文章
|
1月前
|
Python
Flask三种添加路由的方法
Flask 是一个流行的 Python Web 框架,它提供了多种方法来添加路由。路由是将 URL 映射到特定函数的过程,它是构建 Web 应用程序的基础。本文将介绍 Flask 中几种常用的路由添加方法,并附带代码示例。
17 3
|
1月前
|
Python
Flask三种文件下载方法
Flask 是一个流行的 Python Web 框架,它提供了多种方法来实现文件下载。在本文中,我们将介绍三种不同的方法,以便你能够选择最适合你应用程序的方法。
28 2
|
2月前
|
前端开发 安全 JavaScript
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
Python的Flask框架的学习笔记(前后端变量传送,文件上传,网页返回)内含实战:实现一个简单的登录页面
103 0
|
2月前
|
网络架构 Python
在Flask中,如何定义路由并处理HTTP请求的不同方法(GET、POST等)?
【4月更文挑战第25天】在Flask中,使用`@app.route()`装饰器定义路由,如`/hello`,处理GET请求返回&#39;Hello, World!&#39;。通过添加`methods`参数,可处理不同HTTP方法,如POST请求。单一函数可处理多种方法,通过检查`request.method`区分。动态路由使用 `&lt;variable_name&gt;` 传递URL变量到视图函数。这些基础构成处理HTTP请求的Flask应用。
62 1
|
2月前
|
安全 Python
Flask 中的过滤器与自定义过滤器
Flask 中的过滤器与自定义过滤器
25 0
|
11月前
|
数据可视化 前端开发 JavaScript
利用 Flask 动态展示 Pyecharts 图表数据的几种方法
利用 Flask 动态展示 Pyecharts 图表数据的几种方法
|
关系型数据库 MySQL 数据库
当flask账号密码遇到哈希加密方法后,数据库密码无法显示出来怎么解决
当flask账号密码遇到哈希加密方法后,数据库密码无法显示出来怎么解决
68 0
|
存储 JSON UED
Flask框架之RESTful--参数验证--add_argument方法参数详解
参数验证的重要性,Flask-RESTful 参数验证方法,add_argument方法参数详解
|
开发框架 Python
Python的flask框架使用方法和内容解析(参数获取,请求头获取,请求方法等等)
Python的flask框架使用方法和内容解析(参数获取,请求头获取,请求方法等等)
221 0
Python Flask 编程 | 连载 08 - Jinja2 过滤器
Python Flask 编程 | 连载 08 - Jinja2 过滤器
Python Flask 编程 | 连载 08 - Jinja2 过滤器