摘要:注模板包含不存在此問(wèn)題。在模板中,使用過(guò)濾器顯式地標(biāo)記一個(gè)字符串為安全的臨時(shí)地完全禁用自動(dòng)轉(zhuǎn)義系統(tǒng)。通過(guò)在聲明中直接添加或,當(dāng)前的上下文可以傳遞到模板,而且不會(huì)自動(dòng)禁用緩存。
官網(wǎng):http://jinja.pocoo.org/docs/dev/
中文文檔:http://docs.jinkan.org/docs/j...
當(dāng)前版本2.8
安裝:pip install Jinja2
Flask 使用 Jinja 2 作為模板引擎。當(dāng)然,你也可以自由使用其它的模板引擎,但運(yùn)行 Flask 本身仍然需要 Jinja2 依賴 ,這對(duì)啟用富擴(kuò)展是必要的,擴(kuò)展可以依賴 Jinja2 存在。
Jinja 2 默認(rèn)配置如下:
所有擴(kuò)展名為 .html 、 .htm 、 .xml 以及 .xhtml 的模板會(huì)開啟自動(dòng)轉(zhuǎn)義
模板可以利用 {% autoescape %} 標(biāo)簽選擇自動(dòng)轉(zhuǎn)義的開關(guān)。
Flask 在 Jinja2 上下文中插入了幾個(gè)全局函數(shù)和助手,另外還有一些目前默認(rèn)的值
Jinja2 內(nèi)部使用 Unicode
自動(dòng)轉(zhuǎn)義,防止XSS攻擊
標(biāo)準(zhǔn)上下文下面的全局變量默認(rèn)在 Jinja2 模板中可用:
config:當(dāng)前的配置對(duì)象 (flask.config)
request當(dāng)前的請(qǐng)求對(duì)象 (flask.request)。當(dāng)模版不是在活動(dòng)的請(qǐng)求上下文中渲染時(shí)這個(gè)變量不可用。
session當(dāng)前的會(huì)話對(duì)象 (flask.session)。當(dāng)模版不是在活動(dòng)的請(qǐng)求上下文中渲染時(shí)這個(gè)變量不可用。
g請(qǐng)求相關(guān)的全局變量 (flask.g)。當(dāng)模版不是在活動(dòng)的請(qǐng)求上下文中渲染時(shí)這個(gè)變量不可用。
url_for():flask.url_for() 函數(shù)
get_flashed_messages():flask.get_flashed_messages() 函數(shù)
問(wèn)題:Jinja 上下文行為與模板導(dǎo)入import這些變量被添加到了請(qǐng)求的上下文中,而非全局變量。
區(qū)別在于,他們默認(rèn)不會(huì)在導(dǎo)入(import)模板的上下文中出現(xiàn)。這樣做,一方面是考慮到性能,另一方面是為了讓事情顯式透明。注:模板包含include不存在此問(wèn)題。
這對(duì)你來(lái)說(shuō)意味著什么?如果你想要導(dǎo)入一個(gè)需要訪問(wèn)請(qǐng)求對(duì)象的宏,
有兩種可能的方法:
顯式地傳入請(qǐng)求或請(qǐng)求對(duì)象的屬性作為宏的參數(shù)。
使用with context導(dǎo)入宏。
with context導(dǎo)入的方式如下:
{% from "_helpers.html" import my_macro with context %}
{% block title %}{% endblock %}
簡(jiǎn)單使用
>>> from jinja2 import Template >>> template = Template("Hello {{ name }}") >>> template.render(name="John Doe") u"Hello John Doe!"基礎(chǔ)
Jinja2 使用一個(gè)名為 Environment 的中心對(duì)象。這個(gè)類的實(shí)例用于存儲(chǔ)配 置、全局對(duì)象,并用于從文件系統(tǒng)或其它位置加載模板。
配置 Jinja2 為你的應(yīng)用加載文檔的最簡(jiǎn)單方式看起來(lái)大概是這樣:
from jinja2 import Environment, PackageLoader env = Environment(loader=PackageLoader("yourapplication", "templates"))
獲取并渲染模板:
template = env.get_template("mytemplate.html") #用若干變量來(lái)渲染它,調(diào)用 render() 方法: print template.render(the="variables", go="here")變量過(guò)濾器:
hello,{{ name|capitalize }}
常用變量過(guò)濾器列表:
safe 渲染時(shí)不進(jìn)行html轉(zhuǎn)義(默認(rèn)會(huì)進(jìn)行轉(zhuǎn)義)。
capitalize 把值得首字母大寫,其余字符轉(zhuǎn)小寫
lower
upper
title
trim
striptags 渲染之前把值中所有的HTML標(biāo)簽都刪掉
內(nèi)置過(guò)濾器清單
自定義過(guò)濾器自定義過(guò)濾器只是常規(guī)的 Python 函數(shù),過(guò)濾器左邊作為第一個(gè)參數(shù),其余的參數(shù)作 為額外的參數(shù)或關(guān)鍵字參數(shù)傳遞到過(guò)濾器。
例如在過(guò)濾器 {{ 42|myfilter(23) }} 中,函數(shù)被以 myfilter(42, 23) 調(diào) 用。這里給出一個(gè)簡(jiǎn)單的過(guò)濾器示例,可以應(yīng)用到 datetime 對(duì)象來(lái)格式化它們:
def datetimeformat(value, format="%H:%M / %d-%m-%Y"): return value.strftime(format)
你可以更新環(huán)境上的 filters 字典來(lái)把它注冊(cè)到模板環(huán)境上:
environment.filters["datetimeformat"] = datetimeformat
在模板中使用如下:
written on: {{ article.pub_date|datetimeformat }} publication date: {{ article.pub_date|datetimeformat("%d-%m-%Y") }}
除了上面提到的原生方式注冊(cè),在Flask中如果你要在 Jinja2 中注冊(cè)你自己的過(guò)濾器,你還有2種方法。你可以把它們手動(dòng)添加到應(yīng)用的 jinja_env 或者使用 template_filter() 裝飾器。
下面兩個(gè)例子作用相同,都是反轉(zhuǎn)一個(gè)對(duì)象:
#第一種 @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控制自動(dòng)轉(zhuǎn)義
有三種可行的解決方案:
在傳遞到模板之前,用 Markup 對(duì)象封裝 HTML字符串。一般推薦這個(gè)方法。
在模板中,使用 |safe 過(guò)濾器顯式地標(biāo)記一個(gè)字符串為安全的 HTML {{ myvariable|safe }}
臨時(shí)地完全禁用自動(dòng)轉(zhuǎn)義系統(tǒng)。{% autoescape false %}
在模板中禁用自動(dòng)轉(zhuǎn)義系統(tǒng),可以使用 {%autoescape %} 塊:
{% autoescape false %}上下文處理器autoescaping is disabled here
{{ will_not_be_escaped }} {% endautoescape %}
Flask 上下文處理器自動(dòng)向模板的上下文中插入新變量。上下文處理器在模板渲染之前運(yùn)行,并且可以在模板上下文中插入新值。
上下文處理器是一個(gè)返回字典的函數(shù),這個(gè)字典的鍵值最終將傳入應(yīng)用中所有模板的上下文:
@app.context_processor def inject_user(): return dict(user=g.user)
上面的上下文處理器使得模板可以使用一個(gè)名為 user ,值為 g.user 的變量。 不過(guò)這個(gè)例子不是很有意思,因?yàn)?g 在模板中本來(lái)就是可用的,但它解釋了上下文處理器是如何工作的。
變量不僅限于值,上下文處理器也可以使某個(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)
上面的上下文處理器使得 format_price 函數(shù)在所有模板中可用:
{{ format_price(0.33) }}
你也可以構(gòu)建 format_price 為一個(gè)模板過(guò)濾器(見(jiàn) 注冊(cè)過(guò)濾器 ), 但這展示了上下文處理器傳遞函數(shù)的工作過(guò)程。
模板語(yǔ)法這里有兩種分隔符: {% ... %} 和{{ }} 。前者用于執(zhí)行諸如 for 循環(huán) 或賦值的語(yǔ)句,后者把表達(dá)式的結(jié)果打印到模板上。
要把模板中的部分注釋掉,默認(rèn)使用 {# ... #} 注釋語(yǔ)法。
true,false,none,這一點(diǎn)與python內(nèi)置有點(diǎn)區(qū)別
變量:
Jinja2能夠識(shí)別所有類型的變量,例如列表,字典和對(duì)象。如下:
{{ mydict["key"] }} {{ mylist[3] }} {{ mylist[myintvar] }} {{ myobj.somemethod() }}
算術(shù),比較,邏輯語(yǔ)法均和python相同
流程控制:1、條件控制:
{% if user %} hello {{ user }}! {% else %} hello, world {% endif %}
2、for循環(huán):
在一個(gè) for 循環(huán)塊中你可以訪問(wè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ù)。見(jiàn)下面的解釋。
宏支持宏類似于函數(shù)。如:
{% macro render_comment(comment) -%}
為了重復(fù)使用宏,可以將宏定義保存在多帶帶的文件中,然后導(dǎo)入:
{% import "macros.html" as macros %}
此外你也可以從模板中導(dǎo)入名稱到當(dāng)前的命名空間:
{% from "forms.html" import input as input_field, textarea %}模板繼承
{% block head %}{% block title %}{% endblock %} {% endblock %} {% block body %} {% endblock %}
上述定義了三個(gè)塊(block):head、title、body,衍生模板可以修改這三個(gè)塊
{% extends "base.html" %} {% block title %}Index{% endblock %} {% block head %} {{ super() }} {% endblock %} {% block body %}hello
{% endblock %}
在extends指令之后,基模板中的3個(gè)塊被重新定義,模板引擎會(huì)將其插入適當(dāng)位置。super()可以用來(lái)獲取父模板原來(lái)的內(nèi)容。
如果你想要多次打印一個(gè)塊,無(wú)論如何你可以使用特殊的 self 變量并調(diào)用與塊同名 的函數(shù):
嵌套塊和作用域{% block title %}{% endblock %} {{ self.title() }}
{% block body %}{% endblock %}
嵌套塊可以勝任更復(fù)雜的布局。而默認(rèn)的塊不允許訪問(wèn)塊外作用域中的變量:
{% for item in seq %}
這個(gè)例子會(huì)輸出空的 < li> 項(xiàng),因?yàn)?item 在塊中是不可用的。其原因是,如果 塊被子模板替換,變量在其塊中可能是未定義的或未被傳遞到上下文。
從 Jinja 2.2 開始,你可以顯式地指定在塊中可用的變量,只需在塊聲明中添加 scoped 修飾,就把塊設(shè)定到作用域中:
{% for item in seq %}
當(dāng)覆蓋一個(gè)塊時(shí),不需要提供 scoped 修飾。
包含include 語(yǔ)句用于包含一個(gè)模板,并在當(dāng)前命名空間中返回那個(gè)文件的內(nèi)容渲 染結(jié)果:
{% include "header.html" %} Body {% include "footer.html" %}導(dǎo)入與包含的上下文行為
默認(rèn)下,每個(gè)**包含**的模板會(huì)被傳遞到當(dāng)前上下文,而**導(dǎo)入**的模板不會(huì)。 這樣做的原因 import會(huì)被緩存,因?yàn)閷?dǎo)入量經(jīng)常只作容納宏的模塊。并且默認(rèn)下導(dǎo)入的 模板不能訪問(wèn)當(dāng)前模板中的非全局變量。這當(dāng)然也可以顯式地更改。通過(guò)在 import/include 聲明中直接添加 with context 或 without context ,當(dāng)前的上下文可以傳遞到模板,而且不會(huì) 自動(dòng)禁用緩存。
{% from "forms.html" import input with context %} {% include "header.html" %}變量定義與賦值
在代碼塊中,你也可以為變量賦值。在頂層的(塊、宏、循環(huán)之外)賦值是可導(dǎo)出的,即 可以從別的模板中導(dǎo)入。
賦值使用 set 標(biāo)簽,并且可以為多個(gè)變量賦值:
{% set navigation = [("index.html", "Index"), ("about.html", "About")] %}
{% set key, value = call_something() %}
{% raw %} {%blahblahblah%} {% endraw %}自定義錯(cuò)誤頁(yè)面
@app.errorhandler(404) def page_not_found(e): return render_template("404.html"),404鏈接
url_for("index")輸出"/"
url_for("index",_external=True)輸出http://localhost:5000/
特殊路由/static/< filename>
url_for("static",filename="css/style.css") 輸出http://localhost:5000/static/...
默認(rèn)設(shè)置下,F(xiàn)lask在程序目錄中名為static的子目錄中尋找靜態(tài)文件。
http://docs.jinkan.org/docs/j...
國(guó)際化_(" ")
{{ _("Hello World!") }}With 語(yǔ)句
如果應(yīng)用啟用了 With 語(yǔ)句 ,將允許在模板中使用 with 關(guān)鍵 字。
這使得創(chuàng)建一個(gè)新的內(nèi)作用域。這個(gè)作用域中的變量在外部是不可見(jiàn)的。
With 用法簡(jiǎn)介:
{% with %} {% set foo = 42 %} {{ foo }} foo is 42 here {% endwith %} foo is not visible here any longer使用Flask-Moment本地化日期和時(shí)間
詳情請(qǐng)參考
使用Flask-Bootstrap詳情參考
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38288.html
摘要:使用真實(shí)值替代變量,再返回最終得到的響應(yīng)字符串,這一過(guò)程成為渲染。渲染模板渲染模板提供的函數(shù)把模板引擎集成到了程序中。隨后的參數(shù)都是鍵值對(duì),表示模板中變量對(duì)應(yīng)的真實(shí)值。程序現(xiàn)在使用的模板繼承自不是直接繼承自的基模板。 本系列筆記是我閱讀Miguel Grinberg的《Flask Web Development》的筆記,標(biāo)題與書本同步。希望通過(guò)記錄技術(shù)筆記的方式促進(jìn)自己對(duì)知識(shí)的理解。 ...
摘要:官方示例第一行類對(duì)象,這個(gè)無(wú)需解釋。請(qǐng)求對(duì)象的端點(diǎn)請(qǐng)求視圖函數(shù)的參數(shù)通過(guò)源碼的注釋我們可以知道,都只是對(duì)庫(kù)的進(jìn)行了一層包裝并加入一些屬性。接下來(lái)會(huì)有更多關(guān)于和相關(guān)文章放出來(lái),敬請(qǐng)期待參考文檔項(xiàng)目源碼版本注釋版 Flask 是一個(gè) Python 實(shí)現(xiàn)的 Web 開發(fā)微框架, 有豐富的生態(tài)資源。本文從一段官方的示例代碼通過(guò)一步步打斷點(diǎn)方式解釋 Flask 內(nèi)部的運(yùn)行機(jī)制,在一些關(guān)鍵概念會(huì)...
摘要:默認(rèn)的,及使用它的號(hào)數(shù)據(jù)庫(kù)此處使用號(hào)數(shù)據(jù)庫(kù),在客戶端查看記得切換數(shù)據(jù)庫(kù)存儲(chǔ)在本機(jī)內(nèi)存中,比數(shù)據(jù)庫(kù)的方式讀寫快很多默認(rèn)的配置項(xiàng),采用號(hào)庫(kù)。狀態(tài)保持的配置項(xiàng),采用號(hào)庫(kù)。使用名為的配置項(xiàng)存儲(chǔ)數(shù)據(jù)。配置完成后運(yùn)行程序,測(cè)試結(jié)果。 1.配置開發(fā)環(huán)境當(dāng)進(jìn)入虛擬環(huán)境,通過(guò)django_admin創(chuàng)建一個(gè)項(xiàng)目后,會(huì)在項(xiàng)目同名目錄生成一個(gè)setting.py文件。而實(shí)際項(xiàng)目過(guò)程中會(huì)有不同的環(huán)境,如開發(fā)環(huán)境、生...
摘要:默認(rèn)的,及使用它的號(hào)數(shù)據(jù)庫(kù)此處使用號(hào)數(shù)據(jù)庫(kù),在客戶端查看記得切換數(shù)據(jù)庫(kù)存儲(chǔ)在本機(jī)內(nèi)存中,比數(shù)據(jù)庫(kù)的方式讀寫快很多默認(rèn)的配置項(xiàng),采用號(hào)庫(kù)。狀態(tài)保持的配置項(xiàng),采用號(hào)庫(kù)。使用名為的配置項(xiàng)存儲(chǔ)數(shù)據(jù)。配置完成后運(yùn)行程序,測(cè)試結(jié)果。 1.配置開發(fā)環(huán)境當(dāng)進(jìn)入虛擬環(huán)境,通過(guò)django_admin創(chuàng)建一個(gè)項(xiàng)目后,會(huì)在項(xiàng)目同名目錄生成一個(gè)setting.py文件。而實(shí)際項(xiàng)目過(guò)程中會(huì)有不同的環(huán)境,如開發(fā)環(huán)境、生...
閱讀 3146·2021-10-12 10:11
閱讀 1849·2021-08-16 10:59
閱讀 2861·2019-08-30 15:55
閱讀 1236·2019-08-30 14:19
閱讀 2045·2019-08-29 17:03
閱讀 2478·2019-08-29 16:28
閱讀 3229·2019-08-26 13:47
閱讀 2893·2019-08-26 13:36