91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • 編程語言 > 
  • Flask模板操作二:高級操作之自定義過濾器,控制代碼塊和模板代碼復用,模板中特有的變量和函數

Flask模板操作二:高級操作之自定義過濾器,控制代碼塊和模板代碼復用,模板中特有的變量和函數

發布時間:2020-07-22 12:46:49 來源:網絡 閱讀:539 作者:ck_god 欄目:編程語言

自定義過濾器

過濾器的本質是函數。當模板內置的過濾器不能滿足需求,可以自定義過濾器。自定義過濾器有兩種實現方式:

  • 一種是通過Flask應用對象的 add_template_filter 方法

  • 通過裝飾器來實現自定義過濾器

重要:自定義的過濾器名稱如果和內置的過濾器重名,會覆蓋內置的過濾器。

需求:添加列表反轉的過濾器

方式一

通過調用應用程序實例的 add_template_filter 方法實現自定義過濾器。該方法第一個參數是函數名,第二個參數是自定義的過濾器名稱:

def do_listreverse(li):
    # 通過原列表創建一個新列表
    temp_li = list(li)    # 將新列表進行返轉
    temp_li.reverse()    return temp_li

app.add_template_filter(do_listreverse,'lireverse')
方式二

用裝飾器來實現自定義過濾器。裝飾器傳入的參數是自定義的過濾器名稱。

@app.template_filter('lireverse')def do_listreverse(li):
    # 通過原列表創建一個新列表
    temp_li = list(li)    # 將新列表進行返轉
    temp_li.reverse()    return temp_li
  • 在 html 中使用該自定義過濾器

<br/> my_array 原內容:{{ my_array }}<br/> my_array 反轉:{{ my_array | lireverse }}
  • 運行結果

my_array 原內容:[3, 4, 2, 1, 7, 9] 
my_array 反轉:[9, 7, 1, 2, 4, 3]



==================================================================================================

==================================================================================================

控制代碼塊

控制代碼塊主要包含兩個:

- if/else if /else / endif
- for / endfor

if語句

Jinja2 語法中的if語句跟 Python 中的 if 語句相似,后面的布爾值或返回布爾值的表達式將決定代碼中的哪個流程會被執行:

{%if user.is_logged_in() %}
    <a href='/logout'>Logout</a>
{% else %}
    <a href='/login'>Login</a>
{% endif %}

過濾器可以被用在 if 語句中:

{% if comments | length > 0 %}
    There are {{ comments | length }} comments
{% else %}
    There are no comments
{% endif %}

循環

  • 我們可以在 Jinja2 中使用循環來迭代任何列表或者生成器函數

{% for post in posts %}
    <div>
        <h2>{{ post.title }}</h2>
        <p>{{ post.text | safe }}</p>
    </div>
{% endfor %}
  • 循環和if語句可以組合使用,以模擬 Python 循環中的 continue 功能,下面這個循環將只會渲染post.text不為None的那些post:

{% for post in posts if post.text %}
    <div>
        <h2>{{ post.title }}</h2>
        <p>{{ post.text | safe }}</p>
    </div>
{% endfor %}
  • 在一個 for 循環塊中你可以訪問這些特殊的變量:

變量描述
loop.index當前循環迭代的次數(從 1 開始)
loop.index0當前循環迭代的次數(從 0 開始)
loop.revindex到循環結束需要迭代的次數(從 1 開始)
loop.revindex0到循環結束需要迭代的次數(從 0 開始)
loop.first如果是第一次迭代,為 True 。
loop.last如果是最后一次迭代,為 True 。
loop.length序列中的項目數。
loop.cycle在一串序列間期取值的輔助函數。見下面示例程序。
  • 在循環內部,你可以使用一個叫做loop的特殊變量來獲得關于for循環的一些信息

    • 比如:要是我們想知道當前被迭代的元素序號,并模擬Python中的enumerate函數做的事情,則可以使用loop變量的index屬性,例如:

{% for post in posts%}
{{loop.index}}, {{post.title}}
{% endfor %}
  • 會輸出這樣的結果

1, Post title2, Second Post
  • cycle函數會在每次循環的時候,返回其參數中的下一個元素,可以拿上面的例子來說明:

{% for post in posts%}
{{loop.cycle('odd','even')}} {{post.title}}
{% endfor %}
  • 會輸出這樣的結果:

odd Post Title
even Second Post


==================================================================================================

==================================================================================================

模板代碼復用

在模板中,可能會遇到以下情況:

  • 多個模板具有完全相同的頂部和底部內容

  • 多個模板中具有相同的模板代碼內容,但是內容中部分值不一樣

  • 多個模板中具有完全相同的 html 代碼塊內容

像遇到這種情況,可以使用 JinJa2 模板中的 繼承來進行實現




模板繼承

模板繼承是為了重用模板中的公共內容。一般Web開發中,繼承主要使用在網站的頂部菜單、底部。這些內容可以定義在父模板中,子模板直接繼承,而不需要重復書寫。

  • 標簽定義的內容

{% block top %} {% endblock %}
  • 相當于在父模板中挖個坑,當子模板繼承父模板時,可以進行填充。

  • 子模板使用 extends 指令聲明這個模板繼承自哪個模板

  • 父模板中定義的塊在子模板中被重新定義,在子模板中調用父模板的內容可以使用super()

父模板

  • base.html

{% block top %}
  頂部菜單
{% endblock top %}

{% block content %}
{% endblock content %}

{% block bottom %}
  底部
{% endblock bottom %}

子模板

  • extends指令聲明這個模板繼承自哪

{% extends 'base.html' %}
{% block content %}
 需要填充的內容
{% endblock content %}
  • 模板繼承使用時注意點:

    • 不支持多繼承

    • 為了便于閱讀,在子模板中使用extends時,盡量寫在模板的第一行。

    • 不能在一個模板文件中定義多個相同名字的block標簽。

    • 當在頁面中使用多個block標簽時,建議給結束標簽起個名字,當多個block嵌套時,閱讀性更好。


==================================================================================================

==================================================================================================

模板中特有的變量和函數

你可以在自己的模板中訪問一些 Flask 默認內置的函數和對象

config

你可以從模板中直接訪問Flask當前的config對象:

{{config.SQLALCHEMY_DATABASE_URI}}
sqlite:///database.db
request

就是flask中代表當前請求的request對象:

{{request.url}}
http://127.0.0.1
g變量

在視圖函數中設置g變量的 name 屬性的值,然后在模板中直接可以取出

{{ g.name }}
get_flashed_messages()

這個函數會返回之前在flask中通過flask()傳入的消息的列表,flash函數的作用很簡單,可以把由Python字符串表示的消息加入一個消息隊列中,再使用get_flashed_message()函數取出它們并消費掉:

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

甘泉县| 垫江县| 南涧| 香港| 杨浦区| 米脂县| 金溪县| 高淳县| 赤壁市| 宣化县| 海淀区| 汝城县| 中西区| 常山县| 宜宾市| 咸阳市| 普兰店市| 永修县| 香河县| 桐庐县| 镇原县| 新和县| 平乡县| 沧州市| 建始县| 平顶山市| 安阳市| 平舆县| 临桂县| 宣恩县| 上饶县| 乐亭县| 濮阳市| 绥德县| 元江| 宣威市| 英超| 隆回县| 平罗县| 巴林左旗| 巫溪县|