<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                {% raw %} # Python Jinja 教程 > 原文: [http://zetcode.com/python/jinja/](http://zetcode.com/python/jinja/) Jinja 教程展示了如何使用 Jinja 模塊在 Python 中創建模板。 ## Python Jinja 模塊 Jinja 是 Python 的模板引擎。 它類似于 Django 模板引擎。 模板引擎或模板處理器是一個旨在將模板與數據模型結合以生成文檔的庫。 模板引擎通常用于在源代碼預處理中生成大量電子郵件,或生成動態 HTML 頁面。 我們創建一個模板引擎,在其中定義靜態零件和動態零件。 動態部分隨后將替換為數據。 渲染功能隨后將模板與數據結合在一起。 ## Jinja 安裝 ```py $ sudo pip3 install jinja2 ``` 我們使用`pip3`工具安裝 Jinja。 ## Jinja 分隔符 Jinja 在模板字符串中使用各種分隔符。 * `{% %}` - 陳述 * `{{ }}` - 要打印到模板輸出的表達式 * `{# #}` - 模板輸出中未包含的注釋 * `# ##` - 行語句 ## Jinja 簡單的例子 在第一個示例中,我們創建一個非常簡單的模板。 `simple.py` ```py #!/usr/bin/env python3 from jinja2 import Template name = input("Enter your name: ") tm = Template("Hello {{ name }}") msg = tm.render(name=name) print(msg) ``` 該示例要求輸入用戶名并生成消息字符串,該消息字符串將打印給用戶。 模板引擎類似于 Python `format()`方法; 但是模板引擎功能更強大,并且具有更多功能。 ```py from jinja2 import Template ``` 我們從`jinja2`模塊導入`Template`對象。 `Template`是中央模板對象。 它代表一個已編譯的模板,并用于對其進行求值。 ```py tm = Template("Hello {{ name }}") ``` 在我們的模板中,我們具有用于打印變量的`{{ }}`語法。 變量以`render()`方法傳遞。 ```py msg = tm.render(name=name) ``` 使用`render()`方法,我們生成最終輸出。 該方法將模板字符串與作為參數傳遞的數據連接在一起。 傳遞給`render()`方法的變量稱為上下文變量。 ```py $ ./simple.py Enter your name: Paul Hello Paul ``` 這是一個示例輸出。 在下一個示例中,我們使用兩個變量。 `simple2.py` ```py #!/usr/bin/env python3 from jinja2 import Template name = 'Peter' age = 34 tm = Template("My name is {{ name }} and I am {{ age }}") msg = tm.render(name=name, age=age) print(msg) ``` 模板字符串呈現兩個變量:名稱和年齡。 這次變量是硬編碼的。 ```py $ ./simple2.py My name is Peter and I am 34 ``` 這是輸出。 ## Jinja 對象 我們可以使用模板字符串中的對象。 `objects.py` ```py #!/usr/bin/env python3 from jinja2 import Template class Person: def __init__(self, name, age): self.name = name self.age = age def getAge(self): return self.age def getName(self): return self.name person = Person('Peter', 34) tm = Template("My name is {{ per.getName() }} and I am {{ per.getAge() }}") msg = tm.render(per=person) print(msg) ``` 在示例中,我們定義了`Person`對象。 我們通過兩個獲取器獲取名稱和年齡。 ## 字典 Jinja 允許使用方便的點表示法來訪問 Python 字典中的數據。 `dicts.py` ```py #!/usr/bin/env python3 from jinja2 import Template person = { 'name': 'Person', 'age': 34 } tm = Template("My name is {{ per.name }} and I am {{ per.age }}") # tm = Template("My name is {{ per['name'] }} and I am {{ per['age'] }}") msg = tm.render(per=person) print(msg) ``` 我們有一本人字典。 我們使用點運算符訪問字典鍵。 ```py tm = Template("My name is {{ per.name }} and I am {{ per.age }}") # tm = Template("My name is {{ per['name'] }} and I am {{ per['age'] }}") ``` 活動方式和注釋方式均有效。 點符號更方便。 ## Jinja 原始數據 我們可以使用`raw`和`endraw`標記轉義 Jinja 分隔符。 `raw_data.py` ```py #!/usr/bin/env python3 from jinja2 import Template data = ''' {% raw %} His name is {{ name }} {% endraw %} ''' tm = Template(data) msg = tm.render(name='Peter') print(msg) ``` 通過使用`raw`和`endraw`塊,我們逃避了 Jinja `{{ }}`語法。 它是按字面意思印刷的。 ## Jinja 轉義數據 為了轉義諸如`<`或`>`字符之類的數據,我們可以使用過濾器或`escape()`函數。 `escape_data.py` ```py #!/usr/bin/env python3 from jinja2 import Template, escape data = '<a>Today is a sunny day</a>' tm = Template("{{ data | e}}") msg = tm.render(data=data) print(msg) print(escape(data)) ``` 該示例轉義`<`和`>`字符。 ```py tm = Template("{{ data | e}}") ``` 使用`e`過濾器,可以轉儲數據。 過濾器應用`|`字符。 ```py print(escape(data)) ``` 轉義函數執行相同的操作。 ## Jinja 表達式 for 表達式用于迭代模板中的數據收集。 現在,我們不再使用簡單的字符串模板。 我們使用一個`FileSystemLoader`加載的文本文件。 `for_expr.py` ```py #!/usr/bin/env python3 from jinja2 import Environment, FileSystemLoader persons = [ {'name': 'Andrej', 'age': 34}, {'name': 'Mark', 'age': 17}, {'name': 'Thomas', 'age': 44}, {'name': 'Lucy', 'age': 14}, {'name': 'Robert', 'age': 23}, {'name': 'Dragomir', 'age': 54} ] file_loader = FileSystemLoader('templates') env = Environment(loader=file_loader) template = env.get_template('showpersons.txt') output = template.render(persons=persons) print(output) ``` 在此示例中,模板是`showpersons.txt`文件。 該文件位于`templates`目錄中。 ```py persons = [ {'name': 'Andrej', 'age': 34}, {'name': 'Mark', 'age': 17}, {'name': 'Thomas', 'age': 44}, {'name': 'Lucy', 'age': 14}, {'name': 'Robert', 'age': 23}, {'name': 'Dragomir', 'age': 54} ] ``` 數據是字典列表。 ```py file_loader = FileSystemLoader('templates') env = Environment(loader=file_loader) ``` 我們定義一個`FileSystemLoader`。 從`templates`目錄中檢索模板。 ```py template = env.get_template('showpersons.txt') ``` 我們使用`get_template()`方法獲得模板。 `templates/showpersons.txt` ```py {% for person in persons -%} {{ person.name }} {{ person.age }} {% endfor %} ``` 在模板文件中,我們使用`for`表達式遍歷集合。 我們顯示此人的姓名和年齡。 `%`字符旁邊的破折號用于控制空格。 ## Jinja 條件 條件是滿足特定條件時要求值的表達式。 `conditionals.py` ```py #!/usr/bin/env python3 from jinja2 import Environment, FileSystemLoader persons = [ {'name': 'Andrej', 'age': 34}, {'name': 'Mark', 'age': 17}, {'name': 'Thomas', 'age': 44}, {'name': 'Lucy', 'age': 14}, {'name': 'Robert', 'age': 23}, {'name': 'Dragomir', 'age': 54}, ] file_loader = FileSystemLoader('templates') env = Environment(loader=file_loader) env.trim_blocks = True env.lstrip_blocks = True env.rstrip_blocks = True template = env.get_template('showminors.txt') output = template.render(persons=persons) print(output) ``` 該示例僅打印未成年人。 未成年人是指未滿 18 歲的人。 ```py env.trim_blocks = True env.lstrip_blocks = True env.rstrip_blocks = True ``` 輸出中的空白可以通過環境屬性來控制。 `templates/showminors.txt` ```py {% for person in persons %} {% if person.age < 18 %} {{- person.name }} {% endif %} {%- endfor %} ``` 在模板中,我們僅使用`if`表達式輸出 18 歲以下的人。 ```py $ ./conditionals.py Mark Lucy ``` 這是輸出。 ## Jinja `sum`過濾器 可以將過濾器應用于數據以對其進行修改。 例如,`sum`過濾器可以對數據求和,`escape`過濾器對它們進行轉義,`sort`過濾器對它們進行排序。 `sum_filter.py` ```py #!/usr/bin/env python3 from jinja2 import Environment, FileSystemLoader cars = [ {'name': 'Audi', 'price': 23000}, {'name': 'Skoda', 'price': 17300}, {'name': 'Volvo', 'price': 44300}, {'name': 'Volkswagen', 'price': 21300} ] file_loader = FileSystemLoader('templates') env = Environment(loader=file_loader) template = env.get_template('sumprices.txt') output = template.render(cars=cars) print(output) ``` 在示例中,我們使用`sum`過濾器來計算所有汽車價格的總和。 ```py cars = [ {'name': 'Audi', 'price': 23000}, {'name': 'Skoda', 'price': 17300}, {'name': 'Volvo', 'price': 44300}, {'name': 'Volkswagen', 'price': 21300} ] ``` 我們有汽車字典的列表。 每個字典都有一個價格鍵。 它將用于計算總和。 `templates/sumprices.txt` ```py The sum of car prices is {{ cars | sum(attribute='price') }} ``` 在模板文件中,我們將過濾器應用于汽車集合對象。 根據`price`屬性計算總和。 ```py $ ./sum_filter.py The sum of car prices is 105900 ``` 這是輸出。 ## Jinja 模板繼承 模板繼承是一項強大的功能,可減少代碼重復并改善代碼組織。 我們定義了一個基本模板,其他模板文件也從中繼承。 這些模板文件將覆蓋基本模板文件的特定塊。 `ineritance.py` ```py #!/usr/bin/env python3 from jinja2 import Environment, FileSystemLoader content = 'This is about page' file_loader = FileSystemLoader('templates') env = Environment(loader=file_loader) template = env.get_template('about.html') output = template.render(content=content) print(output) ``` 我們渲染`about.html`文件。 它繼承自`base.html`文件。 `base.html` ```py <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>{% block title %}{% endblock %}</title> </head> <body> {% block content%} {% endblock %} </body> </html> ``` 在`base.html`文件中,我們聲明兩個塊:標題和內容。 這些塊將在子模板中填充特定的標簽和文本。 `about.html` ```py {% extends 'base.html' %} {% block title%}About page{% endblock %} {% block content %} <h1>About page</h1> <p> This is about page </p> {% endblock %} ``` `about.html`模板文件繼承自`base.html`。 它添加了特定于此頁面的數據。 我們避免代碼重復; 我們不會在兩個頁面上重復相同的標簽,例如`body`和`html`和`meta`標簽。 ```py {% extends 'base.html' %} ``` 繼承是通過`extends`指令完成的。 ```py {% block title%}About page{% endblock %} ``` 我們定義一個標題。 ```py {% block content %} <h1>About page</h1> <p> This is about page </p> {% endblock %} ``` 并且我們定義內容。 ## Jinja Flask 示例 在下一個示例中,我們創建一個使用 Jinja 的簡單 Flask 應用。 `app.py` ```py #!/usr/bin/env python3 from flask import Flask, render_template, request app = Flask(__name__) @app.route("/greet") def greet(): username = request.args.get('name') return render_template('index.html', name=username) if __name__ == "__main__": app.run() ``` 在此 Flask 應用中,我們獲取用戶名,并將其作為參數傳遞給`render_template()`方法。 `greet()`函數對`/greet`路徑做出反應。 `templates/index.html` ```py <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Greeting</title> </head> <body> <p> Hello {{ name }} </p> </body> </html> ``` 這是模板文件,位于`templates`目錄中。 我們使用`{{ name }}`語法將用戶名添加到模板文件中。 ```py $ python3 app.py * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) ``` 我們啟動服務器。 ```py $ curl http://127.0.0.1:5000/greet?name=Peter <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Greeting</title> </head> <body> <p> Hello Peter </p> </body> </html> ``` 我們使用`curl`工具連接到應用。 我們添加一個名稱參數。 在本教程中,我們介紹了 Python Jinja 模塊。 您可能也對以下相關教程感興趣: [PyMongo 教程](/python/pymongo/), [Python 日志記錄教程](/python/logging/), [pyDAL 教程](/python/pydal/)和 [Python 教程](/lang/python/)。 {% endraw %}
                  <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>

                              哎呀哎呀视频在线观看