1つ、jinja2テンプレートフィルター
- フィルタはパイプ記号(|)を介して使用されます。例:{ {name | length}}、名前の長さが返されます。フィルタは、現在の変数をフィルタに渡す関数と同等であり、フィルタはそれ自体の関数に従って対応する値を返し、結果をページにレンダリングします。Jinja2には多くのフィルターが組み込まれています。ここですべてのフィルターを確認できます。
1. abs(value):数値の絶対値を返します。
2. default(value、default_value、boolean = false):現在の変数に値がない場合、代わりにパラメーターの値が使用されます。
name | default( 'juran')-名前が存在しない場合は、代わりにjuranが使用されます。boolean = Falseのデフォルトでは、変数が未定義の場合にのみデフォルトの値を使用します。Pythonを使用してfalseかどうかを判断する場合は、boolean = trueを渡すことができます。またはを使用して置き換えることもできます。
3.エスケープ(値)またはe:エスケープ文字。<、>などの記号をHTMLの記号にエスケープします。
例:content | escapeまたはcontent | e。
4. first(value):シーケンスの最初の要素を返します。
例:names | first。
5. format(value、* arags、** kwargs):フォーマット文字列。
たとえば、次のコード:{ {"%s"-"%s" | format( 'Hello?'、 "Foo!")}}は次のように出力します:Helloo?-Foo!
6. last(value):シーケンスの最後の要素を返します。
例:names | last。
7. length(value):シーケンスまたはディクショナリの長さを返します。
例:names | length。
8. join(value、d = u ''):シーケンスをパラメーターdの値で文字列に連結します。
9. safe(value):グローバルエスケープがオンになっている場合、セーフフィルターは変数のエスケープをオフにします。
例:content_html | safe。
10. int(value):値をint型に変換します。
11. Float(value):値をfloat型に変換します。
12. lower(value):文字列を小文字に変換します。
13. upper(value):文字列を小文字に変換します。
14. replace(value、old、new):oldをnewに置き換える文字列を置き換えます。
15. truncate(value、length = 255、killwords = False):長さの長さの文字列をインターセプトします。
16. striptags(value):文字列内のすべてのHTMLタグを削除します。複数のスペースが表示される場合、それらは1つのスペースに置き換えられます。
17.トリム:文字列の前後の空白文字をインターセプトします。
18. string(value):変数を文字列に変換します。
19. wordcount(s):長い文字列の単語数を数えます。
2、カスタムフィルター
1.フィルター定義:
@ app.template_filter( "filter name")
defフィルター名(パラメーター)
によって実装される関数
2.フィルターの参照:
- システムフィルター参照方法と同じですが、
- { {変数名|フィルター名}}
- { {変数名|フィルター名(パラメーター)}}
3つの例
1.コード:
from flask import Flask,render_template
from datetime import datetime
app=Flask(__name__)
@app.route('/')
def index():
context = {
'username': 'hello 老萝卜',
'age': -18,
'home': '湖北',
'recommend': 'chinapost', # 删除后,应显示缺省值
'es': "<script>alert('hello everyone');</script>",
'books': ['Python', 'Java', 'PHP'],
'book': {
'Python': 666},
'address': '中国 湖北省 武汉市 东西湖区',
'now_time': datetime(2020, 10, 14, 21, 7, 0)
}
return render_template('demo_jinja2filter.html', **context) # 引用模板
# 自定义过滤器
@app.template_filter('my_filter')
def my_filter(value):
return value.replace('hello', '')
@app.template_filter('handler_time')
def handler_time(time):
"""
小于一分钟---->刚刚
大于一分钟小于一小时---->xxx分钟之前
大于一小时小于24小时----> xxx小时之前
"""
now = datetime.now()
# 获取总秒数
timestamp = (now - time).total_seconds()
if isinstance(time, datetime):
if timestamp < 60:
return '刚刚'
elif 60 <= timestamp <= 60*60:
return '%s分钟之前' % int(timestamp/60)
elif 60*60 < timestamp <= 60*60*24:
return '%s小时之前' % int(timestamp/(60*60))
else:
return time
if __name__=="__main__":
app.run(debug=True)
2.テンプレート
テンプレートは通常./templatesディレクトリに配置されます。ディレクトリを何気なく変更しないことをお勧めします
#./templates/demo_jinja2filter.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jinja2过滤器演示</title>
</head>
<body>
<h1>首页</h1>
用户姓名:{
{
username }}
<p>年龄: {
{
age|abs }} (原值:{
{
age}})</p>
<p>{
{
name|default('这个人很懒,什么都没有留下') }}</p>
{
% autoescape off %}
<p>{
{
es }}</p>
{
% endautoescape %}
<p>{
{
es|safe }}</p>
<p>返回一个序列{
{
books}}的第一个元素:{
{
books|first }}</p>
<p>返回一个序列{
{
books}}的最后一个元素:{
{
books|last }}</p>
<p>返回一个序列{
{
books}}的长度:{
{
books|length }}</p>
<p>返回一个字典{
{
book}}的长度:{
{
book|length }}</p>
<p>返回一个序列{
{
books}}的第一个元素长度:{
{
books|first|length }}</p>
<p>字符串{
{
username}}替换"replace('萝卜', 'luobo')":{
{
username|replace('萝卜', 'luobo') }}</p>
<p>字符串{
{
username}}截取:{
{
username|truncate(length=5) }}</p>
<p>删除字符串"{
{es}}"中所有的HTML标签,如果出现多个空格,将替换成一个空格:{
{
es|striptags }}</p>
<p>计算一个长字符串"{
{address}}"中单词的个数:{
{
address|wordcount }}</p>
<p>{
{
username|my_filter }}</p>
<p>博客发表时间:{
{
now_time|handler_time }}</p>
</body>
</html>