在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 模板
應用環(huán)境
配置管理
大型應用
可插撥視圖
Flask 方案
在 Shell 中使用 Flask
針對高級程序員的前言
使用藍圖的模塊化應用
部署方式
信號
排除應用錯誤
模板
請求環(huán)境
掌握應用錯誤
測試 Flask 應用
前言
教程
安裝
快速上手
Flask 擴展

模板

Flask 使用 Jinja2 作為默認模板引擎。你完全可以使用其它模板引擎。但是不管你使用 哪種模板引擎,都必須安裝 Jinja2 。因為使用 Jinja2 可以讓 Flask 使用更多依賴于 這個模板引擎的擴展。

本文只是簡單介紹如何在 Flask 中使用 Jinja2 。如果要詳細了解這個模板引擎的語法, 請查閱 Jinja2 模板官方文檔 。

Jinja 設置

在 Flask 中, Jinja2 默認配置如下:

  • 在擴展名為 .html 、 .htm 、 .xml 和 .xhtml 的模板中開啟自動轉(zhuǎn)義。
  • 在模板中可以使用 {% autoescape %} 來手動設置是否轉(zhuǎn)義。
  • Flask 在 Jinja2 環(huán)境中加入一些全局函數(shù)和輔助對象,以增強模板的功能。

標準環(huán)境

缺省情況下,以下全局變量可以在 Jinja2 模板中使用:

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

New in version 0.6.

Changed in version 0.10: 此版本開始,這個變量總是可用,甚至是在被導入的模板中。

request 當前請求對象 ( flask.request )。在沒有活動請求環(huán)境情況下渲染模塊 時,這個變量不可用。

session 當前會話對象 ( flask.session )。在沒有活動請求環(huán)境情況下渲染模塊 時,這個變量不可用。

g 請求綁定的全局變量 ( flask.g )。在沒有活動請求環(huán)境情況下渲染模塊 時,這個變量不可用。

url_for() flask.url_for() 函數(shù)。

get_flashed_messages() flask.get_flashed_messages() 函數(shù)。

Jinja 環(huán)境行為

這些添加到環(huán)境中的變量不是全局變量。與真正的全局變量不同的是這些變量在已導入 的模板的環(huán)境中是不可見的。這樣做是基于性能的原因,同時也考慮讓代碼更有條理。

那么對你來說又有什么意義呢?假設你需要導入一個宏,這個宏需要訪問請求對象, 那么你有兩個選擇:

  1. 顯式地把請求或都該請求有用的屬性作為參數(shù)傳遞給宏。
  2. 導入 “with context” 宏。
  3. 導入方式如下:

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

標準過濾器

在 Flask 中的模板中添加了以下 Jinja2 本身沒有的過濾器:

tojson()

這個函數(shù)可以把對象轉(zhuǎn)換為 JSON 格式。如果你要動態(tài)生成 JavaScript ,那么這個函數(shù)非常有用。

注意,在 script 標記內(nèi)部不能轉(zhuǎn)義,因此在 Flask 0.10 之前的版本中,如果要在 script 標記內(nèi)部使用這個函數(shù)必須用 |safe 關閉轉(zhuǎn)義:

<script type=text/javascript>
    doSomethingWith({{ user.username|tojson|safe }});
</script>

控制自動轉(zhuǎn)義

自動轉(zhuǎn)義是指自動對特殊字符進行轉(zhuǎn)義。特殊字符是指 HTML ( 或 XML 和 XHTML )中的 & 、 > 、 < 、 " 和 ' 。因為這些特殊字符代表了特殊的意思, 所以如果要在文本中使用它們就必須把它們替換為“實體”。如果不轉(zhuǎn)義,那么用戶就 無法使用這些字符,而且還會帶來安全問題。(參見跨站腳本攻擊(XSS)

有時候,如需要直接把 HTML 植入頁面的時候,可能會需要在模板中關閉自動轉(zhuǎn)義功能。這個可以直接植入的 HTML 一般來自安全的來源,例如一個把標記語言轉(zhuǎn)換為 HTML 的轉(zhuǎn)換器。

有三種方法可以控制自動轉(zhuǎn)義:

  1. 在 Python 代碼中,可以在把 HTML 字符串傳遞給模板之前,用 Markup 對象封裝。一般情況下推薦使用這個方法。
  2. 在模板中,使用 |safe 過濾器顯式把一個字符串標記為安全的 HTML (例如: {{ myvariable|safe }} )。
  3. 臨時關閉整個系統(tǒng)的自動轉(zhuǎn)義。

在模板中關閉自動轉(zhuǎn)義系統(tǒng)可以使用 {% autoescape %} 塊:

{% autoescape false %}
    <p>autoescaping is disabled here
    <p>{{ will_not_be_escaped }}
{% 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

裝飾器的參數(shù)是可選的,如果不給出就使用函數(shù)名作為過濾器名。一旦注冊完成后,你就可以在模板中像 Jinja2 的內(nèi)建過濾器一樣使用過濾器了。例如,假設在環(huán)境中你有一個名為 mylist 的 Pyhton 列表:

{% for x in mylist | reverse %}
{% endfor %}

環(huán)境處理器

環(huán)境處理器的作用是把新的變量自動引入模板環(huán)境中。環(huán)境處理器在模板被渲染前運行, 因此可以把新的變量自動引入模板環(huán)境中。它是一個函數(shù),返回值是一個字典。在應用的所有模板中,這個字典將與模板環(huán)境合并:

@app.context_processor
def inject_user():
    return dict(user=g.user)

上例中的環(huán)境處理器創(chuàng)建了一個值為 g.user 的 user 變量,并把這個變量加入了 模板環(huán)境中。這個例子只是用于說明工作原理,不是非常有用,因為在模板中, g 總是存在的。

傳遞值不僅僅局限于變量,還可以傳遞函數(shù)( Python 提供傳遞函數(shù)的功能):

@app.context_processor
def utility_processor():
    def format_price(amount, currency=u'€'):
        return u'{0:.2f}{1}'.format(amount, currency)
    return dict(format_price=format_price)

上例中的環(huán)境處理器把 format_price 函數(shù)傳遞給了所有模板:

{{ format_price(0.33) }}

你還可以把 format_price 創(chuàng)建為一個模板過濾器(參見注冊過濾器 ),這里只是演示如何在一個環(huán)境處理器中傳遞函數(shù)。

? Copyright 2013, Armin Ronacher. Created using Sphinx.

上一篇:前言下一篇:配置管理