之前我们已经通过代码了解了一些Flask基本的用法,现在出现一个问题,我们要做的功能越来越多,路由是不是都要放在启动类中呢?例如我们在不同的文件都定义了一些路由,如果想要访问他们,是不是要开启很多个不同的服务呢?
Flask中提供了蓝图,专门用作Flask的模块化。对于蓝图,可以看官方介绍,这里翻译过来的:
Flask使用蓝图的概念来制作应用程序组件和支持应用程序内部或跨应用程序的通用模式。蓝图可以大大简化大型应用程序的工作方式,并为Flask扩展提供了在应用程序上注册操作的中心手段。Blueprint对象的工作方式与Flask应用程序对象类似,但实际上它不是一个应用程序。相反,它是如何构造或扩展应用程序的蓝图。
总之,蓝图可以使我们的程序更加模块化,不同功能的路由可以放在不同的模块下,最后集中到启动类中。下面看一个例子来学习使用蓝图,以上一篇代码为基础,略微修改几处。
分路由类:
from flask import Flask, render_template, Blueprint app = Flask(__name__) test1 = Blueprint('test1', __name__) @test1.route('/test') def test(): return render_template('test1.html')
分路由类:
#encoding:utf-8 #!/usr/bin/env python from flask import Flask, render_template, request, redirect, url_for, session, flash, Blueprint import sys reload(sys) sys.setdefaultencoding('utf8') app = Flask(__name__) form_test = Blueprint('form_test', __name__) app.config['SECRET_KEY'] = 'my' app.secret_key = 'my' @form_test.route('/index') def index(): return render_template('test1.html') @form_test.route('/login', methods=['get', 'post']) def login(): name = request.form.get('name') password = request.form.get('password') if name == 'admin' and password == '123': session['name'] = name return redirect(url_for('login')) if name != 'admin': flash('no this name') return render_template('test1.html', name=session.get('name'))
主路由启动类:
#encoding:utf-8 #!/usr/bin/env python from flask import Flask, render_template from test1 import test1 from form_test import form_test from flask_script import Manager app = Flask(__name__) app.register_blueprint(form_test) app.register_blueprint(test1) @app.route('/') def index(): num = ['tom', 'mike', 'amuxia', 'zhao', 'lisi'] return render_template('/index.html', num=num) @app.errorhandler(404) def miss(e): return render_template('404.html'), 404 @app.errorhandler(500) def error(e): return render_template('500.html'), 500 if __name__=='__main__': print(app.url_map) app.run()
看以上代码大家应该也明白了,分路由中由form_test = Blueprint('form_test', __name__)创建蓝图,而后在主路由中通过app.register_blueprint(form_test)注入。