1、不拆分项目之前的写法
在上一篇Flask入门和视图中我们讲解了Flask项目的一个启动流程,引入Flask、创建Flask对象,然后由路由进入在视图函数中通过模版渲染或者json系列化的方式返回页面或者数据。我们发现这些所有的操作都是在一个页面中完成的,也就是所有功能写在python启动页面app.py中,代码如下:
# 导入Flask
from flask import Flask
# 创建Flask应用对象
app = Flask(__name__)
# 路由route + 视图函数hello_world
@app.route('/')
def hello_world():
# 响应:返回给浏览器的数据
return 'Hello World!'
if __name__ == '__main__':
# 启动服务器
app.run()
这个项目简单那就没问题,但是如果项目稍微复杂一点、有好多的功能,那这个页面就会非常的复杂也不利于开发和维护,所以我们需要对项目进行拆分,比如把视图和数据处理分开、项目模块分开。
2、项目拆分模块化的思路
在接下来的讲解中我们结合实际项目来说明,假如现在有一个项目,主要实现两个模块的功能,一个是登录(login)相关的功能,一个是主页(main)相关的功能。
我们的想法是通过一个页面来管理login相关的功能,把路由和视图函数完全写在里面,通过另一个页面来管理main相关的功能,这样的话就更好维护。
比如:
1、建项目的时候分别创建blueprints、models、static、templates文件夹,分别管理视图、模型数据、静态文件、模版文件
2、分别在这几个文件夹中建login和main两个文件夹,分别来管理各自的模块,各个功能模块放到各自的文件夹中,这样就把项目模块化了,结构更清晰,开发维护也更容易
3、项目结构分析
根据上面的思路我们开始建项目
1、App下的blueprints文件夹
根据上面的项目需求,分别用两个蓝图来管理,分别是blueprints下面的login和main两个文件夹,这里以login相关功能来举例,login下创建了views.py文件夹,在views中创建蓝图,后续login相关的功能都可以在这个文件下实现,同理,也在main文件夹下创建views文件,在views文件中创建蓝图,来管理main相关的路由和视图函数。注意:大家看到login和home文件夹下都有一个__init__文件,这个可以不实现里面的内容,但是必须要有)
这里提到了蓝图,什么事蓝图?
蓝图实际可以理解为是一个存储一组视图方法的容器对象,可以通过一个蓝图对象管理路由以及视图函数,蓝图不是一个完整的应用,不能独立运行,只能注册到应用中。一个应用可以具有多个蓝图Blueprint
蓝图的使用可以分两个步骤,一个是创建,一个是注册
蓝图的创建
上面blueprints/login/views文件中完成了蓝图的创建,也就是创建了管理login相关路由以及视图函数的蓝图
from flask import Blueprint
#创建login页面的蓝图
login_bp = Blueprint(
'login',__name__,
template_folder='templates',
static_folder='static')
@login_bp.route('/login')
def index():
return '这个是login的跟页面'
blueprints/main/views文件中完成了蓝图的创建,也就是创建了管理main相关路由以及视图函数的蓝图
from flask import Blueprint
#创建login页面的蓝图
main_bp = Blueprint(
'main',__name__,
template_folder='templates',
static_folder='static')
@main_bp.route('/home')
def index():
return '这个是main的跟页面'
2、App下的__init__.py文件
该文件是项目的初始化文件,在这个文件中引入了Flask和蓝图,创建Flask对象以及注册蓝图都在这里面完成
蓝图的注册
from flask import Flask
from App.blueprints.login.views import login_bp
from App.blueprints.main.views import main_bp
def create_app():
app = Flask(__name__)
#注册蓝图
app.register_blueprint(blueprint = login_bp)
app.register_blueprint(blueprint = main_bp,url_prefix='/main')
return app
注意: App.blueprints.login.views是蓝图的路径App是根路径
url_prefix='/mainhttp://127.0.0.1:5000自动加上该路径
3、入口文件,app.py
该文件为入口文件,文件中通过from import在App文件夹中导出__init__中的create_app方法,该方法返回了注册过蓝图的Flask对象,通过这个Flask对象.run实现项目运行
from App import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
启动项目后,先访问到app.py 文件,该文件通过create_app方法获取到App下__init__文件中的Flask对象app,该app已经注册了main以及login两个蓝图,这样就完成了一个小型的项目。输入http://127.0.0.1:5000/login返回 “这个是login的跟页面”,输入http://127.0.0.1:5000/main/home返回“这个是main的跟页面”