我们的应用经常会区分用户站点和管理员后台,比如本博客所使用的zblog,就有网站和后台两部分。两者虽然都在同一个应用中,但是风格迥异。把它们分成两个应用吧,总有些代码我们想重用;放在一起嘛,耦合度太高,代码不便于管理。所以Flask提供了蓝图(Blueprint)功能。蓝图使用起来就像应用当中的子应用一样,可以有自己的模板,静态目录,有自己的视图函数和URL规则,蓝图之间互相不影响。但是它们又属于应用中,可以共享应用的配置。对于大型应用来说,我们可以通过添加蓝图来扩展应用功能,而不至于影响原来的程序。不过有一点要注意,目前Flask蓝图的注册是静态的,不支持可插拔
将蓝图放在一个包里是一个好习惯,我们例如创建一个目录fp,然后在目录下创建一个空的__init__.py,为什么需要创建__init__.py文件?因为创建了这个文件这个目录就变成了一个包了,另外创建一个我们需要编写应用的python文件,例如tools.py,其中内容如下:
#!/usr/bin/env/python3 #coding:utf-8 __author__ = 'yang.su' from flask import Flask,Blueprint app = Flask(__name__) fptools = Blueprint('tools', __name__, url_prefix='/fp') @fptools.route('/') def index(): return 'admin123'
这里是我们创建的蓝图对象fptools,其中的Blueprint方法的第一个参数为蓝图名称,第二个是栏目所在模块名,第三个是蓝图URL前缀
这样蓝图对象创建好了,我们需要去主程序里面对这个蓝图对象进行注册,注册蓝图的方法是app.register_blueprint,我的代码如下:
#!/usr/bin/env/python3 #coding:utf-8 __author__ = 'yang.su' from flask import Flask,Blueprint from fp.tools import fptools app = Flask(__name__) app.register_blueprint(fptools) @app.route('/') def index(): return 'admin' if __name__ == '__main__': app.run(debug = True)
这样我们访问http://localhost:5000/和http://localhost:5000/fp/分别显示如下:
注意使用了注册了栏目,如果使用url_for生成地址时,里面的方法名字前面加.或者添加完整模块名,例如
{{ url_for('gadget') }} #原来是这样 #改为下面两种均可 {{ url_for('devtools.gadget') }} #或者这样 {{ url_for('.gadget') }}