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