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

自定義過濾器

過濾器的本質(zhì)是函數(shù)。當(dāng)模板內(nèi)置的過濾器不能滿足需求,可以自定義過濾器。自定義過濾器有兩種實(shí)現(xiàn)方式:

創(chuàng)新互聯(lián)建站于2013年成立,先為奇臺(tái)等服務(wù)建站,奇臺(tái)等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為奇臺(tái)企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

  • 一種是通過Flask應(yīng)用對(duì)象的 add_template_filter 方法

  • 通過裝飾器來實(shí)現(xiàn)自定義過濾器

重要:自定義的過濾器名稱如果和內(nèi)置的過濾器重名,會(huì)覆蓋內(nèi)置的過濾器。

需求:添加列表反轉(zhuǎn)的過濾器

方式一

通過調(diào)用應(yīng)用程序?qū)嵗?add_template_filter 方法實(shí)現(xiàn)自定義過濾器。該方法第一個(gè)參數(shù)是函數(shù)名,第二個(gè)參數(shù)是自定義的過濾器名稱:

def do_listreverse(li):
    # 通過原列表創(chuàng)建一個(gè)新列表
    temp_li = list(li)    # 將新列表進(jìn)行返轉(zhuǎn)
    temp_li.reverse()    return temp_li

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

用裝飾器來實(shí)現(xiàn)自定義過濾器。裝飾器傳入的參數(shù)是自定義的過濾器名稱。

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

<br/> my_array 原內(nèi)容:{{ my_array }}<br/> my_array 反轉(zhuǎn):{{ my_array | lireverse }}
  • 運(yùn)行結(jié)果

my_array 原內(nèi)容:[3, 4, 2, 1, 7, 9] 
my_array 反轉(zhuǎn):[9, 7, 1, 2, 4, 3]

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

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

控制代碼塊

控制代碼塊主要包含兩個(gè):

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

if語句

Jinja2 語法中的if語句跟 Python 中的 if 語句相似,后面的布爾值或返回布爾值的表達(dá)式將決定代碼中的哪個(gè)流程會(huì)被執(zhí)行:

{%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 %}

循環(huán)

  • 我們可以在 Jinja2 中使用循環(huán)來迭代任何列表或者生成器函數(shù)

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

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

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

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

{% for post in posts%}
{{loop.index}}, {{post.title}}
{% endfor %}
  • 會(huì)輸出這樣的結(jié)果

1, Post title2, Second Post
  • cycle函數(shù)會(huì)在每次循環(huán)的時(shí)候,返回其參數(shù)中的下一個(gè)元素,可以拿上面的例子來說明:

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

odd Post Title
even Second Post

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

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

模板代碼復(fù)用

在模板中,可能會(huì)遇到以下情況:

  • 多個(gè)模板具有完全相同的頂部和底部?jī)?nèi)容

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

  • 多個(gè)模板中具有完全相同的 html 代碼塊內(nèi)容

像遇到這種情況,可以使用 JinJa2 模板中的 繼承來進(jìn)行實(shí)現(xiàn)

模板繼承

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

  • 標(biāo)簽定義的內(nèi)容

{% block top %} {% endblock %}
  • 相當(dāng)于在父模板中挖個(gè)坑,當(dāng)子模板繼承父模板時(shí),可以進(jìn)行填充。

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

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

父模板

  • base.html

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

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

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

子模板

  • extends指令聲明這個(gè)模板繼承自哪

{% extends 'base.html' %}
{% block content %}
 需要填充的內(nèi)容
{% endblock content %}
  • 模板繼承使用時(shí)注意點(diǎn):

    • 不支持多繼承

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

    • 不能在一個(gè)模板文件中定義多個(gè)相同名字的block標(biāo)簽。

    • 當(dāng)在頁面中使用多個(gè)block標(biāo)簽時(shí),建議給結(jié)束標(biāo)簽起個(gè)名字,當(dāng)多個(gè)block嵌套時(shí),閱讀性更好。

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

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

模板中特有的變量和函數(shù)

你可以在自己的模板中訪問一些 Flask 默認(rèn)內(nèi)置的函數(shù)和對(duì)象

config

你可以從模板中直接訪問Flask當(dāng)前的config對(duì)象:

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

就是flask中代表當(dāng)前請(qǐng)求的request對(duì)象:

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

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

{{ g.name }}
get_flashed_messages()

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

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

網(wǎng)頁題目:Flask模板操作二:高級(jí)操作之自定義過濾器,控制代碼塊和模板代碼復(fù)用,模板中特有的變量和函數(shù)
鏈接分享:http://muchs.cn/article48/jcjchp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、App設(shè)計(jì)、關(guān)鍵詞優(yōu)化、小程序開發(fā)、做網(wǎng)站靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)