之前有一篇笔记讲过了过滤器的定义和使用,但是是基于jinja2模板引擎的,可以先看看我过去的笔记:https://sulao.cn/post/551.html
其实flask内也带有过滤器,实例对象的过滤器方法是add_template_filter,他的用法有两种
我们还是按照大型项目的标准来,在工厂函数中去注册过滤器
第一种方式
我们现在统一的文件中创建过滤器函数,我的文件命令是filter.py
内容如下
#!/usr/bin/python3 #coding:utf-8 __author__ = 'yang.su' import base64 def bs64_encode(str): bs64_str = base64.b64encode(str.encode("utf-8")) return bs64_str.decode("utf-8")
在工厂函数文件中定义一个过滤器函数
from app.filter import bs64_encode def create_app(): app = Flask(__name__) app.secret_key = 'yang.su' register_blueprint(app) configure_logger(app) template_filter(app) return app def template_filter(app): app.add_template_filter(bs64_encode,'bs64_encode')
并在create_app中注册它,这样在程序启动时就被flask实例创建并注册,最后我们就可以直接在模板中使用,用法如下
{{ var | bs64_encode }}
模板变量的值就被base64转码了
第二种方式
第二种方式主要通过装饰器修饰来注册到实例中
我们在入口文件中添加函数主体
@app.template_filter() def bs64_encode(str): bs64_str = base64.b64encode(str.encode("utf-8")) return bs64_str.decode("utf-8")
装饰器函数参数可以设置,不设置的话就是下面被装饰的函数的名字为参数
前端模板调用还是和原来一样
后面一种方式最好是在入口文件上绑定并注册,不然放置到其他文件下,需要注册上下文,才会正常
推荐还是在工厂函数中注册自定义过滤器,方便统一管理和注册