Flask1.0.2使用蓝图来分类应用模块URL

我们的应用经常会区分用户站点和管理员后台,比如本博客所使用的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/分别显示如下:

menu.saveimg.savepath20180919115244.jpg

menu.saveimg.savepath20180919115306.jpg


注意使用了注册了栏目,如果使用url_for生成地址时,里面的方法名字前面加.或者添加完整模块名,例如

{{ url_for('gadget') }} #原来是这样
#改为下面两种均可
{{ url_for('devtools.gadget') }}
#或者这样
{{ url_for('.gadget') }}


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/550.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。