zoukankan      html  css  js  c++  java
  • 用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法

    目录

    前文列表

    用 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() 来生成的。

  • 相关阅读:
    B1031
    B1021
    B1021
    B1021
    Android 系统服务一览表
    MULTI-INTERFACE CONNECTIVITY ON ANDROID
    ConnectivityManager 确定和监控网络连接状态
    Android系统各种类型的service刨根解读
    Android Netd
    Android am 指令的使用
  • 原文地址:https://www.cnblogs.com/jmilkfan-fanguiju/p/7532279.html
Copyright © 2011-2022 走看看