一、url_for
一般我们通过一个URL
就可以执行到某一个函数。如果反过来,我们知道一个函数,怎么去获得这个URL
呢?url_for函数
就可以帮我们实现这个功能。url_for()
函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL
的后面作为查询参数。
通过构建URL
的方式而选择直接在代码中拼URL
的原因有两点:
- 将来如果修改了
URL
,但没有修改该URL
对应的函数名,就不用到处去替换URL
了。 url_for()
函数会转义特殊字符和Unocode数据
,这些工作都不需要我们自己处理。
#--html--
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>清宝贝花艺</title> </head> <body> <h1>清宝贝花艺</h1> <!-- {#{{用来存放变量}}#}--> <!-- {#{% 用来执行函数或者逻辑代码 %}#}--> <!-- 首页链接调转到指定页面--> <p><a href={{url_for('huashu')}}>鲜花</a></p> <p><a href={{url_for('lvzhi')}}>绿植</a></p> </body> </html>
#--python--
from flask import Flask,render_template,url_for #指定templates路径 app = Flask(__name__,template_folder=r'D:\untitled\flask_env\templates') @app.route('/') #@app.route,是一个装饰器 #@app.route('/')就是将url中的/映射到hello_world这个视图函数上面 def index(): return render_template('index.html') @app.route('/huashu/') #传递多个参数 def huashu(): context={ 'name':'鲜花', 'price':'¥215', 'describe':{ 'variety1':'玫瑰', 'variety2': '百合' } } return render_template('posts/huashu.html',**context) #传递单个参数 @app.route('/li/lvzhi/') def lvzhi(): context={ 'name':'绿植', 'price':'¥215', 'describe':{ 'variety1':'绿萝', 'variety2': '虎皮椒' } } return render_template('posts/lvzhi.html',**context) if __name__ == '__main__': app.run(host='127.0.0.1',port=5000,debug=True)
二、过滤器
过滤器是通过管道符号(|
)进行使用的,例如:{{ name|length }}
,将返回name的长度。过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中
- 过滤器基本使用
abs(value)
:返回一个数值的绝对值。 例如:-1|abs
。default(value,default_value,boolean=false)
:如果当前变量没有值,则会使用参数中的值来代替。name|default('xiaotuo')
——如果name不存在,则会使用xiaotuo
来替代。boolean=False
默认是在只有这个变量为undefined
的时候才会使用default
中的值,如果想使用python
的形式判断是否为false
,则可以传递boolean=true
。也可以使用or
来替换。escape(value)或e
:转义字符,会将<
、>
等符号转义成HTML中的符号。例如:content|escape
或content|e
。first(value)
:返回一个序列的第一个元素。names|first
。-
format(value,*arags,**kwargs)
:格式化字符串。例如以下代码:{{ "%s" - "%s"|format('Hello?',"Foo!") }}将输出:Helloo? - Foo!
-
last(value)
:返回一个序列的最后一个元素。示例:names|last
。 -
length(value)
:返回一个序列或者字典的长度。示例:names|length
。 -
join(value,d=u'')
:将一个序列用d
这个参数的值拼接成字符串。 -
safe(value)
:如果开启了全局转义,那么safe
过滤器会将变量关掉转义。示例:content_html|safe
。 -
int(value)
:将值转换为int
类型。 -
float(value)
:将值转换为float
类型。 -
lower(value)
:将字符串转换为小写。 -
upper(value)
:将字符串转换为小写。 -
replace(value,old,new)
: 替换将old
替换为new
的字符串。 -
truncate(value,length=255,killwords=False)
:截取length
长度的字符串。 -
striptags(value)
:删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。 -
trim
:截取字符串前面和后面的空白字符。 -
string(value)
:将变量转换成字符串。 -
wordcount(s)
:计算一个长字符串中单词的个数。
- default默认值过滤器
使用方式“{{value|default(默认值),boolean=True}}”,如果key不存在,设置boolean=True表示使用默认值,此外简写模式可以使用or来替代{{default(默认值),boolean=True}}
--html--
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>清宝贝花艺</title> </head> <body> <h1>清宝贝花艺</h1> <p>花店名称:{{shope_name}}</p> <!-- 花店介绍默认值:没有输入任何介绍时,页面显示的内容--> <!-- <p>花店介绍:{{describe|default('小本经营,童叟无欺',boolean=True)}}</p>--> <!-- 花店介绍默认值简写模式--> <p>花店介绍:{{describe or '小本经营,童叟无欺'}}</p> <!-- {#{{用来存放变量}}#}--> <!-- {#{% 用来执行函数或者逻辑代码 %}#}--> <!-- 首页链接调转到指定页面--> <p><a href={{url_for('huashu')}}>鲜花</a></p> <p><a href={{url_for('lvzhi')}}>绿植</a></p> </body> </html>
--python--
from flask import Flask,render_template,url_for #指定templates路径 app = Flask(__name__,template_folder=r'D:\untitled\flask_env\templates') @app.route('/') #@app.route,是一个装饰器 #@app.route('/')就是将url中的/映射到hello_world这个视图函数上面 def index(): context={ 'shope_name':'清宝贝花房', #指定花点介绍 # 'describe':'花点时间,精致生活从这里开启!' # 未指定花点介绍 'describe':None } return render_template('index.html',**context) if __name__ == '__main__': app.run(host='127.0.0.1',port=5000,debug=True)
- 自定义过滤器
过滤器本质上就是一个函数,如果在模板中调用这个过滤器,那么就会将这个变量的值作为第一个参数传递给过滤器这个函数,然后函数的返回值会作为这个过滤器的返回值。需要用到一个装饰器:‘@app.template_filter('自定义过滤器的名称')’
--html--
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>清宝贝花艺</title> </head> <body> <h1>清宝贝花艺</h1> <p>花店名称:{{shope_name|cut}}</p> <!-- 花店介绍默认值:没有输入任何介绍时,页面显示的内容--> <!-- <p>花店介绍:{{describe|default('小本经营,童叟无欺',boolean=True)}}</p>--> <!-- 花店介绍默认值简写模式--> <p>花店介绍:{{describe or '小本经营,童叟无欺'}}</p> <!-- {#{{用来存放变量}}#}--> <!-- {#{% 用来执行函数或者逻辑代码 %}#}--> <!-- 首页链接调转到指定页面--> <p><a href={{url_for('huashu')}}>鲜花</a></p> <p><a href={{url_for('lvzhi')}}>绿植</a></p> </body> </html>
--python--
from flask import Flask, render_template, url_for # 指定templates路径 app = Flask(__name__, template_folder=r'D:\untitled\flask_env\templates') #保存自动加载程序 app.config['TEMPLATES_AUTO_RELOAD']=True @app.route('/') # @app.route,是一个装饰器 # @app.route('/')就是将url中的/映射到hello_world这个视图函数上面 def index(): context = { 'shope_name': '清宝贝花房', # 指定花点介绍 'describe':'花点时间,精致生活从这里开启!' # 未指定花点介绍 # 'describe': None } return render_template('index.html', **context) @app.template_filter('cut') #把过滤加入到服务,传入的参数是过滤器的名字 # 自定义过滤器 def cut(value): value = value.replace("清宝贝", 'Kissbaby') return value if __name__ == '__main__': app.run(host='127.0.0.1', port=5000, debug=True)