Python Flask:蓝图的使用

来自CloudWiki
跳转至: 导航搜索

什么是蓝图

蓝图(blueprint):用于实现单个应用的视图、模板、静态文件的集合。 蓝图就是模块化处理的类。类似于django中app,子应用。

为什么要使用蓝图

一个最小的应用

flask教程都喜欢用一个非常小的应用示例向你展示flask的小巧灵活,例如下面的这个应用

run.py:

from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'



if __name__ == '__main__':
    app.run(port=5678)

真正的flask应用,绝不可能是如此的短小,而是划分许多模块,要提供很多功能。

一个稍大点的flask应用

下面的flask应用里,有一个user模块专门提供和用户有关的功能,例如用户注册,登录,登出,修改密码。还有一个admin模块,用来做后台管理,本示例只是为了向你展示如何在一个脚本里编写所有的模块,因此这些视图函数并没有具体的实现。

run.py:

from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'


# user模块
@app.route('/user/register')
def register():
    return 'register'

@app.route('/user/login')
def login():
    return 'login'

@app.route('/user/modify_password')
def modify_password():
    return 'modify_password'


# admin模块
@app.route('/admin/alluser')
def alluser():
    return 'alluser'


@app.route('/admin/deluser')
def deluser():
    return 'deluser'



if __name__ == '__main__':
    app.run(port=5678)

和最小的flask应用相比,这个应用多了两个模块,5个视图函数,这仍然是一个非常小的flask应用。在实践项目中,子模块和视图函数会非常的多,因此,不可能将他们都写在同一个脚本里,那样的话,这个脚本会非常的大,难以维护。


BluePrint 蓝图技术

蓝图技术,可以帮助你实现flask应用的模块划分,对于没有亲身经历过大项目的人来说,很难理解模块划分的好处,换一种阐述方式,没有经历过大项目的人,根本不知道不划分模块或者模块划分不合理所带来的麻烦。


BluePrint 蓝图的使用

项目结构

我将第2小节的应用划分出两个模块,划分后,项目结构不再是一个单一的脚本,一个模块拥有一个属于自己的文件目录,与之相关的代码都将写在这里。项目结构如下:

Python22013101.png

接下来,展示这些脚本里的内容

创建蓝图

通常,将蓝图放在一个单独的包里。

在项目所在目录下 创建一个目录app,用以盛放各个蓝图。

并在其中创建一个”user"子目录,并创建一个__init__.py 文件:

user/init.py

创建了一个蓝图对象user_blue,使用起来类似app对象,可以有自己的路由user_blue.route

Blueprint(home,__name__,url_prefix)第一个参数指定了蓝图的名称,第2个参数指定了蓝图所在的模块名,第3个参数指定了路由网址。

from flask import Blueprint

user_blue = Blueprint('user', __name__, url_prefix='/user')
from . import views

user/views.py


# user模块
from app.user import user_blue


# user模块
@user_blue.route('/register')
def register():
    return 'register'

@user_blue.route('/login')
def login():
    return 'login'

@user_blue.route('/modify_password')
def modify_password():
    return 'modify_password'

注册并使用蓝图

创建完蓝图之后,需要注册蓝图。在Flask主程序中,使用"app.register_blueprint()"方法即可。

run.py:

from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'

#from admin import admin_blue
from app.user import user_blue

#app.register_blueprint(admin_blue)
app.register_blueprint(user_blue)

if __name__ == '__main__':
    app.run(port=5678)

效果图

运行之后在浏览器输入:http://127.0.0.1:5678/user/register

Python22013102.png

第3小节的项目代码,多了一些模块的划分,自然也多了一些文件目录,而且咋看起来,比第2小节的代码变复杂了些,但这种“复杂”是值得的, 它换来了整个项目清晰的结构,很好的控制了单个脚本的代码规模。


参考文档:

https://zhuanlan.zhihu.com/p/357444025