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 上下文行爲
這些變量被添加到上下文變量,它們不是全局變量。不一樣在於,它們默認不會 在導入模板的上下文中出現。這樣作,一方面是考慮到性能,另外一方面是爲了讓事情顯式透明。
對於你着意味着什麼?若是你但願導入一個宏,你有兩種可能來訪問請求對象:
在上下文中導入的方式以下:
{% 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)}}