模板

Flask利用Jinja2的模板引擎,,爲了豐富的擴展可用,全部的擴展是依賴於Jinja2的存在html

 

jinja2配置flask

除非定製,Flask中Jinja2配置以下:安全

全部以.html,.htm,.xml,.xhtml結尾的模板開啓自動轉義.session

一個模板能夠用{%autosecape%}標籤選擇開關自動轉義app

Flask在Jinja2上下文中插入了幾個全局函數和助手,還有一些目前默認的值函數

 

標準上下文性能

下面的全局變量默認在jinja2模板中可用:url

config:spa

當前配置對象(flask.config)orm

request:當前請求對象(flask.request)

session;當前會話對象(flask.session)

g:實現全局變量的請求範圍的對象(flask.g)

url_for():flask.url_for()函數

get_flashed_messages():flask.get_flashed_messages()函數

Jinja 上下文行爲

這些變量被添加到上下文變量,它們不是全局變量。不一樣在於,它們默認不會 在導入模板的上下文中出現。這樣作,一方面是考慮到性能,另外一方面是爲了讓事情顯式透明。

對於你着意味着什麼?若是你但願導入一個宏,你有兩種可能來訪問請求對象:

  1. 你顯式地傳入請求或請求對象的屬性做爲宏的參數。
  2. 使用 「with context」 導入宏。

在上下文中導入的方式以下:

{% from '_helpers.html' import my_macro with context %}

 

標準過濾器:

這些過濾器在jinja2中是可用的,也是Jinja2自帶的過濾器

toJson():這個函數把給定的對象轉換成JSON表示,若是要動態生成JavaScript

注意在script標籤裏面轉義是不該該發生的,所以須要用|safe禁止轉義

 

控制自動轉義:

自動轉義的概念是自動爲你轉義特殊字符.HTML意義下的特殊字符是&,>,<,"以及',由於這些字符在文檔中表示他們特定的含義,須要在模板中禁用自動轉義,這種狀況多是想要在頁面顯示的插入HTML,有三種方式:

在Python代碼中,在傳遞到模板以前,用Markup對象封裝HTML字符串,在模板中使用safe過濾器顯示標記一個字符串安全

暫時的禁止自動轉義系統,可使用{%autoescape%}塊在模板中禁用轉義系統:

{%autoescape false%}

<p>autoescapeing is disabled

<p>{{will_not_be_escapes}}

{%endautoescape%}

 

註冊過濾器:

在Jinja2中註冊你本身的過濾器,兩種方式,手動加入到jinja_env或者使用template_filter()裝飾器

@app.template_filter('reverse')

def reverse_filter(s):

return s[::-1]

def reverse_filter(s):

return s[::-1]

app.jinja_env.filters['reverse'] = reverse_filter

在使用裝飾器的狀況下,

{%for x in mylist | reverse%}

{%endfor%}

 

上下文處理器

Flask中的上下文處理器自動向模板的上下文插入新變量,上下文處理器在模板渲染以前運行,而且能夠在模板上下文中插入新值,上下文處理器是一個返回字典的函數,這個字典的鍵值將與應用中的全部模板上下文結合:

@app.context_processor

def inject_user():

return dict(user=g.user)

上訴的上下文處理器使得一個名爲user,值爲g.user的變量在模板中可用,由於g在任何模板中都是可用的,

變量不只限於值,一個上下文處理器也可使函數在模板中可用(因爲Python容許傳遞函數)

@app.context_processor

def utility_processor():

  def format_price(amount,currency=u'$'):

    return u{0:.2f}{1}.format(amount,currency)

  return dict(format_price = formatprice)

上面的上下文處理器使得format_price函數在全部模板中可用:

{{format_price(0.33)}}

相關文章
相關標籤/搜索