<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### 導航 - [索引](# "總目錄") - [下一頁](# "測試 Flask 應用") | - [上一頁](# "福利: 應用測試") | - [Flask 0.10.1 文檔](#) ? # 模板 Flask 使用 Jinja 2 作為模板引擎。當然,你也可以自由使用其它的模板引擎,但運行Flask 本身仍然需要 Jinja2 依賴 ,這對啟用富擴展是必要的,擴展可以依賴 Jinja2 存在。 本節只是快速地介紹 Jinja2 是如何集成到 Flask 中的。更多關于 Jinja2 語法本身的信息,請參考官方文檔[Jinja2 模板引擎](http://jinja.pocoo.org/2/documentation/templates) [http://jinja.pocoo.org/2/documentation/templates] 。 ### Jinja 配置 Jinja 2 默認配置如下: - 所有擴展名為 .html 、 .htm 、 .xml 以及 .xhtml的模板會開啟自動轉義 - 模板可以利用 {%autoescape%} 標簽選擇自動轉義的開關。 - Flask 在 Jinja2 上下文中插入了幾個全局函數和助手,另外還有一些目前默認的值 ### 標準上下文 下面的全局變量默認在 Jinja2 模板中可用: config 當前的配置對象 (flask.config) 0.6 新版功能. 在 0.10 版更改: 現在這總是可用的,甚至在導入的模版里。 request 當前的請求對象 ([flask.request](# "flask.request"))。當模版不是在活動的請求上下文中渲染時這個變量不可用。 session 當前的會話對象 ([flask.session](# "flask.session"))。當模版不是在活動的請求上下文中渲染時這個變量不可用。 g 請求相關的全局變量 ([flask.g](# "flask.g"))。當模版不是在活動的請求上下文中渲染時這個變量不可用。 url_for() [flask.url_for()](# "flask.url_for") 函數 get_flashed_messages() [flask.get_flashed_messages()](# "flask.get_flashed_messages") 函數 Jinja 上下文行為 這些變量被添加到了請求的上下文中,而非全局變量。區別在于,他們默認不會在導入模板的上下文中出現。這樣做,一方面是考慮到性能,另一方面是為了讓事情顯式透明。 這對你來說意味著什么?如果你想要導入一個需要訪問請求對象的宏,有兩種可能的方法: 1. 顯式地傳入請求或請求對象的屬性作為宏的參數。 1. 與上下文一起(with context)導入宏。 與上下文中一起(with context)導入的方式如下: ~~~ {% from '_helpers.html' import my_macro with context %} ~~~ ### 標準過濾器 這些過濾器在 Jinja2 中可用,也是 Jinja2 自帶的過濾器: tojson() 這個函數把給定的對象轉換為 JSON 表示,如果你要動態生成 JavaScript 這里有一個非常有用的例子。 注意 script 標簽里的東西不應該被轉義,因此如果你想在 script 標簽里使用它,請使用 |safe 來禁用轉義,: ~~~ <script type=text/javascript> doSomethingWith({{ user.username|tojson|safe }}); </script> ~~~ ### 控制自動轉義 自動轉義的概念是自動轉義特殊字符。 HTML (或 XML ,因此也有 XHTML )意義下的特殊字符是 & , > , < , " 以及 ' 。因為這些字符在文檔中表示它們特定的含義,如果你想在文本中使用它們,應該把它們替換成相應的“實體”。不這么做不僅會導致用戶疲于在文本中使用這些字符,也會導致安全問題。(見 [*跨站腳本攻擊(XSS)*](#) ) 雖然你有時會需要在模板中禁用自動轉義,比如在頁面中顯式地插入 HTML ,可以是一個來自于 markdown 到 HTML 轉換器的安全輸出。 我們有三種可行的解決方案: - 在傳遞到模板之前,用 [Markup](# "flask.Markup") 對象封裝 HTML字符串。一般推薦這個方法。 - 在模板中,使用 |safe 過濾器顯式地標記一個字符串為安全的 HTML( {{myvariable|safe}} )。 - 臨時地完全禁用自動轉義系統。 在模板中禁用自動轉義系統,可以使用 {%autoescape%} 塊: ~~~ {% autoescape false %} <p>autoescaping is disabled here <p>{{ will_not_be_escaped }} {% endautoescape %} ~~~ 無論何時,都請務必格外小心這里的變量。 ### 注冊過濾器 如果你要在 Jinja2 中注冊你自己的過濾器,你有兩種方法。你可以把它們手動添加到應用的 [jinja_env](# "flask.Flask.jinja_env") 或者使用[template_filter()](# "flask.Flask.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 ~~~ 在使用裝飾器的情況下,如果你想以函數名作為過濾器名,參數是可選的。注冊之后,你可以在模板中像使用 Jinja2 內置過濾器一樣使用你的過濾器,例如你在上下文中有一個名為 mylist 的 Python 列表: ~~~ {% 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=format_price) ~~~ 上面的上下文處理器使得 format_price 函數在所有模板中可用: ~~~ {{ format_price(0.33) }} ~~~ 你也可以構建 format_price 為一個模板過濾器(見 [*注冊過濾器*](#) ),但這展示了上下文處理器傳遞函數的工作過程。 ? 版權所有 2013, Armin Ronacher.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看