Flask學習

測試器

在Jinja2中,測試器(Test)是一些用來測試變量或者表達式,返回布爾值的特殊函數

例如,用測試器來判斷一個變量或表達式是否是一個數字

{% if age is number %}
    {{ age*365 }}
{% else %}
    數字無效
{% endif %}

內置測試器

Jinja2內置了許多測試器,其中比較常用的有

  • calable(obj)                判斷對象是否可以被調用
  • defined(value)            判斷變量是否已經定義
  • undefiend(value)        判斷變量是否未定義
  • none(value)                判斷變量是否爲none
  • number(value)            判斷變量是否是數字
  • string(value)                判斷變量是否是字符串
  • sequence(value)         判斷變量是否是序列,比如字符串、列表、元組
  • iterable(value)             判斷變量是否可迭代
  • mapping(value)           判斷變量是否是匹配對象,比如字典
  • sameas(value,other)   判斷變量與other是否指向相同內存地址

 

使用方法

if左側是測試器的第一個參數,其他參數可以寫在括號內

{% if foo is sameas(bar) %}

也可以在右側用空格鏈接

{% if foo is sameas bar %}

 

自定義測試器

和自定義過濾器類似,我們可以用Flask提供的app.template_test()裝飾器來註冊一個自定義測試器

例如

@app.template_test()
def baz(n):
    if n == 'ok':
        return True
    else:
        return False

效果圖

 

數字無效 之前的是以前寫的,與這篇文章內容無關。

 

模板環境對象

Jinja2中,渲染行爲由jinja2.Enviroment類控制,所有的配置選項、上下文變量、全局函數、過濾器和測試器都存儲在Enviroment上。在與Flask結合後,我們不單獨創建Enviroment對象,而是使用Flask創建的Enviroment對象,它存儲在app.jinja_env上。

模板環境中的全局函數、過濾器和測試器分別存儲在Enviroment對象的globals、filters和tests 屬性中,這些都是字典對象。除了之前介紹的使用Flask裝飾器和方法註冊自定義函數,我們也可以直接操作這三個字典來添加相應的函數或變量。

例如

1.添加自定義全局對象

def bar():
    return "I'm bar."
foo = "I'm foo"

app.jinja_env.globals['bar'] = bar
app.jinja_env.globals['foo'] = foo

 

2.添加自定義過濾器

def smiling(s):
    return s + ':)'


app.jinja_env.filters['smiling'] = smiling

3.添加自定義測試器

def baz(n):
    if n == 'ok':
        return True
    else:
        return False


app.jinja_env.tests['baz'] = baz

 

模板結構組織

局部模板

在Web程序裏,我們通常會爲每一類頁面寫一個獨立的模板。比如主頁模板、用戶登陸模板。這些模板可以直接在視圖函數中渲染並作爲HTML響應主體。除了這些模板以外,我們還會用到另外一些模板,他們就是局部模板或者叫次模板,因爲他們僅包含部分代碼,所以我們不會在視圖函數中渲染它,而是插入到其他獨立模板中。

當多個獨立模板需要用到同一塊HTML代碼時,我們可以把這段代碼抽離出來作爲一個局部模板。這樣可以避免重複,同時也更好地進行統一管理。

例如,多個頁面中都要顯示一個同樣的提示條 ,我們把這個提示條單獨寫在一個HTML文件中,假設它就叫_banner.html。

我們使用include標籤來插入局部模板,這會把局部模板的內容插入到使用這個include標籤的位置。也就是說我們可以在任意模板中用以下代碼插入_banner.html的內容:

{% include '_banner.html' %}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章