成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

FlaskWeb開發(fā)讀書筆記之jinja2模板

tangr206 / 507人閱讀

摘要:注模板包含不存在此問(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):

    {% for comment in comments %}
  • {{ comment }}
  • {% endfor %}

在一個(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) -%}
    
  • {{ comment }}
  • {%- endmacro %}
      {% for comment in comments %} {{ render_comment(comment) }} {% endfor %}

    為了重復(fù)使用宏,可以將宏定義保存在多帶帶的文件中,然后導(dǎo)入:

    {% import "macros.html" as macros %}
    
      {% for comment in comments %} {{ macros.render_comment(comment) }} {% endfor %}

    此外你也可以從模板中導(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 %}
        
  • {% block loop_item %}{{ item }}{% endblock %}
  • {% endfor %}

    這個(gè)例子會(huì)輸出空的 < li> 項(xiàng),因?yàn)?item 在塊中是不可用的。其原因是,如果 塊被子模板替換,變量在其塊中可能是未定義的或未被傳遞到上下文。
    從 Jinja 2.2 開始,你可以顯式地指定在塊中可用的變量,只需在塊聲明中添加 scoped 修飾,就把塊設(shè)定到作用域中:

    {% for item in seq %}
        
  • {% block loop_item scoped %}{{ item }}{% endblock %}
  • {% endfor %}

    當(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() %}

    不進(jìn)行Jinjia2語(yǔ)法解釋
    {% 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/

    靜態(tài)文件

    特殊路由/static/< filename>
    url_for("static",filename="css/style.css") 輸出http://localhost:5000/static/...
    默認(rèn)設(shè)置下,F(xiàn)lask在程序目錄中名為static的子目錄中尋找靜態(tài)文件。

    內(nèi)置工具函數(shù)

    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

    相關(guān)文章

    • [叁]Flask web開發(fā):模板

      摘要:使用真實(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í)的理解。 ...

      mochixuan 評(píng)論0 收藏0
    • Flask 源碼閱讀筆記 開篇

      摘要:官方示例第一行類對(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ì)...

      mikyou 評(píng)論0 收藏0
    • django中的配置文件

      摘要:默認(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)境、生...

      番茄西紅柿 評(píng)論0 收藏0
    • django中的配置文件

      摘要:默認(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)境、生...

      williamwen1986 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

    最新活動(dòng)
    閱讀需要支付1元查看
    <