ホームページ >バックエンド開発 >Python チュートリアル >Python Flask JinJa2 構文の使用方法

Python Flask JinJa2 構文の使用方法

WBOY
WBOY転載
2023-05-16 09:19:131591ブラウズ

1. 概要

Flask は、Jinja2 テンプレート エンジンをサポートする軽量の Python Web フレームワークです。 Jinja2 は、Flask を使用して動的 Web アプリケーションを作成するために使用できる人気のある Python テンプレート エンジンです。

Web ページには通常、HTML、CSS、JS が必要です。おそらく、初めて Python Web を学習するときは、次のように書くかもしれません:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return &#39;<h2>hello</h2><p >hello world!!!</p>&#39;
if __name__ == &#39;__main__&#39;:
	app.run(host=&#39;0.0.0.0&#39;, port=8000, debug=True)

上記のコードも実行できますが、美しくありません。 . これでプログラミングが基本になります 上記はすべてフロントエンドとバックエンドの分離であり、フロントエンド コードはバックエンド プロキシに埋め込まれません フロントエンドとフロントエンドの分離を実現するために、MVT 設計計画は

MMModel と綴られ、MVC の M と同じ機能を持ち、データベースと対話してデータ処理を実行します。

VView と表記され、MVC の C と同じ機能を持ち、リクエストを受け取り、業務処理を行ってレスポンスを返します。

TTemplate として綴られます。これは MVC の V と同じ機能を持ち、返される HTML をカプセル化して構築する役割を果たします。

Python Flask JinJa2 構文の使用方法

#2. JinJa2 構文の紹介と例の説明

JinJa2 構文の紹介と例の説明:

1) 変数

Jinja2 では、

{{ }} を使用して変数を含めます。 Flask では、変数をテンプレートに渡すことで変数を表示できます。サンプル コードは次のとおりです。

# variable.py
# Flask中将变量传递给模板
from flask import Flask, render_template
app = Flask(__name__)
# 也可指定模板目录
# app = Flask(__name__, template_folder="/opt/python-projects/flask")
@app.route(&#39;/&#39;)
def hello():
    name = "Alice"
    return render_template(&#39;variable.html&#39;, name=name)
if __name__ == &#39;__main__&#39;:
    app.run(host=&#39;0.0.0.0&#39;, port=8000, debug=True)

上記のコードでは、変数

namehello.html テンプレートに渡されます。

<!-- templates/variable.html模板 -->
<!DOCTYPE html>
<html>
<head>
    <title>variable</title>
</head>
<body>
    <h2>hello {{ name }}!</h2>
</body>
</html>

実行

python3 variable.py

アクセス

curl http://192.168.182.110:8000/

2) 制御構造

Jinja2では、

if, を使用できます。 forwhile などのステートメントは、テンプレートの出力を制御するために使用されます。サンプル コードは次のとおりです。

# if.py
# Flask中使用if控制结构
from flask import Flask, render_template
app = Flask(__name__)
@app.route(&#39;/&#39;)
def hello():
    user = {"name": "Alice", "age": 25}
    return render_template(&#39;if.html&#39;, user=user)
if __name__ == &#39;__main__&#39;:
    app.run(host=&#39;0.0.0.0&#39;, port=8000, debug=True)

templates/if.html テンプレート ファイル

<!-- if.html模板 -->
<!DOCTYPE html>
<html>
<head>
    <title>Hello</title>
</head>
<body>
    {% if user %}
        {% if user.age >= 18 %}
            <h2>Hello {{ user.name }}, you are an adult!</h2>
        {% else %}
            <h2>Hello {{ user.name }}, you are a minor!</h2>
        {% endif %}
    {% else %}
        <h2>Hello, anonymous user!</h2>
    {% endif %}
</body>
</html>

上記のコードでは、if ステートメントを使用して出力を制御し、表示します。ユーザーの年齢ニュースに応じて異なります。

3) ループ構造

Jinja2 では、

for ステートメントを使用して、出力テンプレートのコンテンツをループできます。サンプル コードは次のとおりです。

# for.py
# Flask中使用for循环结构
from flask import Flask, render_template
app = Flask(__name__)
@app.route(&#39;/&#39;)
def hello():
    users = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]
    return render_template(&#39;for.html&#39;, users=users)
if __name__ == &#39;__main__&#39;:
    app.run(host=&#39;0.0.0.0&#39;, port=8000, debug=True)

templates/for.html テンプレート ファイル

<!-- for.html模板 -->
<!DOCTYPE html>
<html>
<head>
    <title>Hello</title>
</head>
<body>
    {% for user in users %}
        <h2>Hello {{ user.name }}!</h2>
        <p>You are {{ user.age }} years old.</p>
    {% endfor %}
</body>
</html>

上記のコードでは、

for ループを使用して次のことを行います。ユーザーリストを反復処理し、各ユーザーの情報を出力します。

4) マクロ

Jinja2 では、マクロを使用して再利用できるコード ブロックを定義できます。サンプル コードは次のとおりです:

# great.py
# Flask中使用宏
from flask import Flask, render_template
app = Flask(__name__)
@app.route(&#39;/&#39;)
def hello():
    users = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}]
    return render_template(&#39;great.html&#39;, users=users)
if __name__ == &#39;__main__&#39;:
    app.run(host=&#39;0.0.0.0&#39;, port=8000, debug=True)

マクロを定義する

templates /macros.html Template

# 定义一个宏
{% macro print_user(user) %}
    <h2>Hello {{ user.name }}!</h2>
    <p>You are {{ user.age }} years old.</p>
{% endmacro %}

上記のコードでは、

print_user という名前のマクロが定義されています。このマクロは、import# を通じてテンプレートにインポートできます。 ## 、マクロを使用してユーザー情報を出力します。テンプレート templates/great.html<pre class="brush:php;toolbar:false">&lt;!-- great.html模板 --&gt; &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Hello&lt;/title&gt; &lt;/head&gt; &lt;body&gt; {% for user in users %} {% import &amp;#39;macros.html&amp;#39; as macros %} {{ macros.print_user(user) }} {% endfor %} &lt;/body&gt; &lt;/html&gt;</pre> 上記のコードでは、ユーザー情報を出力するために print_user という名前のマクロが定義されています。

5) フィルター

Jinja2 では、フィルターは日付のフォーマット、大文字と小文字の変換などの変数を処理できます。サンプル コードは次のとおりです。

# filter.py
# Flask中使用过滤器
from flask import Flask, render_template
import datetime
app = Flask(__name__)
@app.route(&#39;/&#39;)
def hello():
    now = datetime.datetime.now()
    return render_template(&#39;filter.html&#39;, now=now)
# 自定义过滤器
@app.template_filter(&#39;datetimeformat&#39;)
def datetimeformat(value, format=&#39;%Y-%m-%d %H:%M:%S&#39;):
    return value.strftime(format)
if __name__ == &#39;__main__&#39;:
    app.run(host=&#39;0.0.0.0&#39;, port=8000, debug=True)

テンプレート ファイル

templates/filter.html

<pre class="brush:php;toolbar:false">&lt;!-- filter.html模板 --&gt; &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Hello&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;p&gt;The current date and time is: {{ now|datetimeformat }}&lt;/p&gt; &lt;/body&gt; &lt;/html&gt;</pre>上記のコードでは、

datetimeformat

という名前のファイルが日付と時刻をフォーマットするためのフィルターを定義しました。ここではカスタム フィルターを紹介します。実際、JinJa2 にはいくつかの組み込みフィルターもあります。 Jinja2 の組み込みフィルター: jinja.palletsprojects.com/en/3.0.x/te…<table><tbody> <tr class="firstRow"> <th>过滤器名</th> <th>解释</th> <th>举例</th> </tr> <tr> <td>abs(value)</td> <td>返回一个数值的绝对值</td> <td>{{ -1|abs }}</td> </tr> <tr> <td>int(value)</td> <td>将值转换为int类型</td> <td>{{ param | int }}</td> </tr> <tr> <td>float(value)</td> <td>将值转换为float类型</td> <td><br></td> </tr> <tr> <td>string(value)</td> <td>将变量转换成字符串</td> <td><br></td> </tr> <tr> <td>default(value,default_value,boolean=false)</td> <td>如果当前变量没有值,则会使用参数中的值来代替。如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换</td> <td>{{ name|default('xiaotuo') }}</td> </tr> <tr> <td>safe(value)</td> <td>如果开启了全局转义,那么safe过滤器会将变量关掉转义</td> <td>{{ content_html|safe }}</td> </tr> <tr> <td>escape(value)或e</td> <td>转义字符,会将等符号转义成HTML中的符号</td> <td>{{ content|escape或content|e }}</td> </tr> <tr> <td>first(value)</td> <td>返回一个序列的第一个元素</td> <td>{{ names|first }}</td> </tr> <tr> <td>format(value,*arags,**kwargs)</td> <td>格式化字符串</td> <td>%s"-"%s"|format('Hello?',"Foo!") }} 输出 Hello?-Fool!</td> </tr> <tr> <td>last(value)</td> <td>返回一个序列的最后一个元素。</td> <td>{{ names|last }}</td> </tr> <tr> <td>length(value)</td> <td>返回一个序列或者字典的长度。</td> <td>{{ names|length }}</td> </tr> <tr> <td>join(value,d='+')</td> <td>将一个序列用d这个参数的值拼接成字符串</td> <td><br></td> </tr> <tr> <td>lower(value)</td> <td>将字符串转换为小写</td> <td><br></td> </tr> <tr> <td>upper(value)</td> <td>将字符串转换为小写</td> <td><br></td> </tr> <tr> <td>replace(value,old,new)</td> <td>替换将old替换为new的字符串</td> <td><br></td> </tr> <tr> <td>truncate(value,length=255,killwords=False)</td> <td>截取length长度的字符串</td> <td><br></td> </tr> <tr> <td>striptags(value)</td> <td>删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格</td> <td><br></td> </tr> <tr> <td>trim</td> <td>截取字符串前面和后面的空白字符</td> <td>{{ str123 | trim }}</td> </tr> <tr> <td>wordcount(s)</td> <td>计算一个长字符串中单词的个数</td> <td><br></td> </tr> </tbody></table> <h4>6)继承</h4> <p>在Jinja2中,可以使用继承来创建一个包含共同元素的模板,并通过继承该模板来创建更具体的模板。示例代码如下:</p><pre class="brush:py;"># extend.py # Flask中使用继承 from flask import Flask, render_template app = Flask(__name__) @app.route(&amp;#39;/&amp;#39;) def hello(): return render_template(&amp;#39;extend.html&amp;#39;) if __name__ == &amp;#39;__main__&amp;#39;: app.run(host=&amp;#39;0.0.0.0&amp;#39;, port=8000, debug=True)</pre><p>模板文件 <code>templates/base.html

<!-- base.html模板 -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>

模板文件 templates/extend.html

<!-- extend.html模板 -->
{% extends "base.html" %}
{% block title %}Hello{% endblock %}
{% block content %}
    <h2>Hello World!</h2>
{% endblock %}

在上面的代码中,定义了一个名为 base.html 的模板,并在 extend.html 模板中继承了该模板。extend.html 模板中可以重写 base.html 模板中的块,并在其中添加新的内容。

7)包含

在Jinja2中,可以使用包含来将一个模板包含到另一个模板中。示例代码如下:

# contain.py
# Flask中使用包含
from flask import Flask, render_template
app = Flask(__name__)
@app.route(&#39;/&#39;)
def hello():
    return render_template(&#39;contain.html&#39;)
if __name__ == &#39;__main__&#39;:
    app.run(host=&#39;0.0.0.0&#39;, port=8000, debug=True)

模板文件 templates/contain.html

<!-- contain.html模板 -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block content %}{% endblock %}
    {% include "footer.html" %}
</body>
</html>

模板文件 templates/footer.html

<!-- footer.html模板 -->
<footer>
    <p>&copy; 2023</p>
</footer>

在上面的代码中,定义了一个名为 footer.html 的模板,并在 contain.html 模板中使用包含将 footer.html 模板包含到页面底部。这样,可以避免在每个页面中重复添加相同的页脚。

以上がPython Flask JinJa2 構文の使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。