Rumah >pembangunan bahagian belakang >Tutorial Python >Cara menggunakan sintaks Python Flask JinJa2
Flask ialah rangka kerja web Python ringan yang menyokong enjin templat Jinja2. Jinja2 ialah enjin templat Python popular yang boleh digunakan untuk mencipta aplikasi web dinamik menggunakan Flask.
Halaman web biasanya memerlukan html, css dan js Apabila anda mula-mula mempelajari web python, anda boleh menulis seperti ini:
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return '<h2>hello</h2><p >hello world!!!</p>' if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
Walaupun kod di atas boleh dilaksanakan, ia tidak cantik pengaturcaraan adalah asas Semua di atas adalah pemisahan bahagian hadapan dan bahagian belakang, dan kod bahagian hadapan tidak akan dibenamkan dalam proksi bahagian belakang Untuk mencapai pemisahan bahagian hadapan dan bahagian hadapan, penyelesaian reka bentuk MVT ialah digunakan:
M
dinyatakan sebagai Model
, yang sama dengan M dalam MVC Fungsinya adalah sama, bertanggungjawab untuk berinteraksi dengan pangkalan data dan melaksanakan pemprosesan data.
V
dinyatakan sebagai View
, yang mempunyai fungsi yang sama seperti C dalam MVC Ia menerima permintaan, menjalankan pemprosesan perniagaan dan mengembalikan respons.
T
dinyatakan sebagai Template
, yang mempunyai fungsi yang sama seperti V dalam MVC dan bertanggungjawab untuk merangkum dan membina html untuk dikembalikan.
Pengenalan sintaks JinJa2 dan penjelasan contoh:
Dalam Jinja2, gunakan {{ }}
untuk memasukkan pembolehubah. Dalam Flask, anda boleh memaparkan pembolehubah dengan menghantarnya ke templat. Kod sampel adalah seperti berikut:
# variable.py # Flask中将变量传递给模板 from flask import Flask, render_template app = Flask(__name__) # 也可指定模板目录 # app = Flask(__name__, template_folder="/opt/python-projects/flask") @app.route('/') def hello(): name = "Alice" return render_template('variable.html', name=name) if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
Dalam kod di atas, pembolehubah name
dihantar ke templat hello.html
.
<!-- templates/variable.html模板 --> <!DOCTYPE html> <html> <head> <title>variable</title> </head> <body> <h2>hello {{ name }}!</h2> </body> </html>
melaksanakan
python3 variable.py
untuk mengakses
curl http://192.168.182.110:8000/
Dalam Jinja2, anda boleh menggunakan if
, for
dan while
dan pernyataan lain untuk mengawal output dalam templat. Kod sampel adalah seperti berikut:
# if.py # Flask中使用if控制结构 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): user = {"name": "Alice", "age": 25} return render_template('if.html', user=user) if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
templates/if.html
Fail templat
<!-- 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>
Dalam kod di atas, gunakan pernyataan if untuk mengawal output dan memaparkan mesej yang berbeza mengikut umur pengguna.
Dalam Jinja2, anda boleh menggunakan pernyataan for
untuk menggelungkan kandungan dalam templat output. Kod sampel adalah seperti berikut:
# for.py # Flask中使用for循环结构 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): users = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}] return render_template('for.html', users=users) if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
templates/for.html
Fail templat
<!-- 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>
Dalam kod di atas, gunakan gelung for
untuk melintasi senarai pengguna dan mengeluarkan maklumat setiap pengguna.
Dalam Jinja2, anda boleh menggunakan makro untuk menentukan blok kod yang boleh digunakan semula Kod sampel adalah seperti berikut:
# great.py # Flask中使用宏 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): users = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}] return render_template('great.html', users=users) if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
Tentukan makrotemplates/macros.html
templat
# 定义一个宏 {% macro print_user(user) %} <h2>Hello {{ user.name }}!</h2> <p>You are {{ user.age }} years old.</p> {% endmacro %}
Dalam kod di atas, makro bernama print_user
ditakrifkan Makro boleh diimport melalui import
dalam templat dan digunakan untuk mengeluarkan maklumat pengguna. Templat templates/great.html
<!-- great.html模板 --> <!DOCTYPE html> <html> <head> <title>Hello</title> </head> <body> {% for user in users %} {% import 'macros.html' as macros %} {{ macros.print_user(user) }} {% endfor %} </body> </html>
Dalam kod di atas, makro bernama print_user ditakrifkan untuk mengeluarkan maklumat pengguna.
Dalam Jinja2, penapis boleh memproses pembolehubah, seperti tarikh pemformatan, menukar huruf besar, dll. Kod sampel adalah seperti berikut:
# filter.py # Flask中使用过滤器 from flask import Flask, render_template import datetime app = Flask(__name__) @app.route('/') def hello(): now = datetime.datetime.now() return render_template('filter.html', now=now) # 自定义过滤器 @app.template_filter('datetimeformat') def datetimeformat(value, format='%Y-%m-%d %H:%M:%S'): return value.strftime(format) if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
Fail templat templates/filter.html
<!-- filter.html模板 --> <!DOCTYPE html> <html> <head> <title>Hello</title> </head> <body> <p>The current date and time is: {{ now|datetimeformat }}</p> </body> </html>
Dalam kod di atas, penapis bernama datetimeformat
ditakrifkan untuk memformat tarikh dan masa. Berikut ialah penapis tersuai Malah, JinJa2 juga mempunyai beberapa penapis terbina dalam. Penapis terbina dalam dalam Jinja2: jinja.palletsprojects.com/en/3.0.x/te…
过滤器名 | 解释 | 举例 |
---|---|---|
abs(value) | 返回一个数值的绝对值 | {{ -1|abs }} |
int(value) | 将值转换为int类型 | {{ param | int }} |
float(value) | 将值转换为float类型 | |
string(value) | 将变量转换成字符串 | |
default(value,default_value,boolean=false) | 如果当前变量没有值,则会使用参数中的值来代替。如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换 | {{ name|default('xiaotuo') }} |
safe(value) | 如果开启了全局转义,那么safe过滤器会将变量关掉转义 | {{ content_html|safe }} |
escape(value)或e | 转义字符,会将等符号转义成HTML中的符号 | {{ content|escape或content|e }} |
first(value) | 返回一个序列的第一个元素 | {{ names|first }} |
format(value,*arags,**kwargs) | 格式化字符串 | %s"-"%s"|format('Hello?',"Foo!") }} 输出 Hello?-Fool! |
last(value) | 返回一个序列的最后一个元素。 | {{ names|last }} |
length(value) | 返回一个序列或者字典的长度。 | {{ names|length }} |
join(value,d='+') | 将一个序列用d这个参数的值拼接成字符串 | |
lower(value) | 将字符串转换为小写 | |
upper(value) | 将字符串转换为小写 | |
replace(value,old,new) | 替换将old替换为new的字符串 | |
truncate(value,length=255,killwords=False) | 截取length长度的字符串 | |
striptags(value) | 删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格 | |
trim | 截取字符串前面和后面的空白字符 | {{ str123 | trim }} |
wordcount(s) | 计算一个长字符串中单词的个数 |
在Jinja2中,可以使用继承来创建一个包含共同元素的模板,并通过继承该模板来创建更具体的模板。示例代码如下:
# extend.py # Flask中使用继承 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): return render_template('extend.html') if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
模板文件 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
模板中的块,并在其中添加新的内容。
在Jinja2中,可以使用包含来将一个模板包含到另一个模板中。示例代码如下:
# contain.py # Flask中使用包含 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): return render_template('contain.html') if __name__ == '__main__': app.run(host='0.0.0.0', 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>© 2023</p> </footer>
在上面的代码中,定义了一个名为 footer.html
的模板,并在 contain.html
模板中使用包含将 footer.html
模板包含到页面底部。这样,可以避免在每个页面中重复添加相同的页脚。
Atas ialah kandungan terperinci Cara menggunakan sintaks Python Flask JinJa2. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!