首先,我对蓝图的理解相对通俗,就是觉得蓝图对于视图方法模块化、大项目协同开发过程中的一个很好的工具.
1.下图是我们通常情况下使用的项目组织结构
aaarticlea/png;base64,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" alt="" />
看一下视图方法:
#views.py
1 from app import app @app.route('/user/index')
def index():
return 'user_index' @app.route('/user/show')
def show():
return 'user_show' @app.route('/user/add')
def add():
return 'user_add' @app.route('/admin/index')
def adminindex():
return 'admin_index' @app.route('/admin/show')
def adminshow():
return 'admin_show' @app.route('/admin/add')
def adminadd():
return 'admin_add' #从视图方法中,我们看到有6个视图,分别对应admin,user两个不同用户的3个功能index,add,show.
这样写显然没问题,但是明显与python提倡的模块化,优雅的代码特点相违背,即不是很python的python代码. 让我们在这里假想两个问题:
1.如果admin和user不止只有3个功能呢,比如好几百个,导致views的代码量已经达到了上万行?
2.如果我们有多个同事分工开发admin,user和其它可能的模块呢,都同时往一个views里写代码吗,在做版本控制时,提交过程中频繁出现提交冲突了怎么办?
3.加入我们要抛弃admin或者user功能块时怎么办,要一一手动删除所有admin或是user相关的代码吗,这样当然可以,但是会不会太low呢? 当然根据Pythonic特点,我们肯定希望尽可能的把代码尽量的模块化,让我们的代码看起来更加的优雅和顺畅,这个时候flask.Blueprint(蓝图)就派上用场了
什么是蓝图?
一个蓝图定义了可用于单个应用的视图,模板,静态文件等等的集合。
我什么时候会用到蓝图?
蓝图的杀手锏是将你的应用组织成不同的组件,比如把这里的admin,user相关的视图方法分为两个组件,一个是admin组件,一个是user组件.这时我们可以
创建两个蓝图实现这两个独立的组件.
2.我们如何使用蓝本将上述的视图方法看上去更加pythonic呢?
由于上面的例子中只有两个组件(模块)admin,user,我们可以创建名为admin.py和user.py的两个文件,分别在里面创建两个蓝图的实例对象admin,user.
直接上代码:
#admin.py
#admin.py
from flask import Blueprint,render_template, request admin = Blueprint('admin',__name__) @admin.route('/index')
def index():
return render_template('admin/index.html') @admin.route('/add')
def add():
return 'admin_add' @admin.route('/show')
def show():
return 'admin_show' #要想创建一个蓝图对象,你需要import flask.Blueprint()
类并用参数name
和import_name
初始化。import_name通常用__name__
,一个表示当前模块的特殊的Python变量,作为import_name
的取值。
#user.py
from flask import Blueprint, render_template, redirect user = Blueprint('user',__name__) @user.route('/index')
def index():
return render_template('user/index.html') @user.route('/add')
def add():
return 'user_add' @user.route('/show')
def show():
return 'user_show'
好了,视图函数已经分开了,我们如何使用它们的呢?再来看一下我们的views.py变成了什么样吧?
#views.py
from app import app
from .admin import admin
from .user import user
#这里分别给app注册了两个蓝图admin,user
#参数url_prefix='/xxx'的意思是设置request.url中的url前缀,
#即当request.url是以/admin或者/user的情况下才会通过注册的蓝图的视图方法处理请求并返回
app.register_blueprint(admin,url_prefix='/admin')
app.register_blueprint(user, url_prefix='/user')
#现在我们的views是否已经变得很简单了呢?顺便回答第三个问题,如果想弃用某一个组件(模块)我们只需要相对应的注释掉给app注册蓝图的行即可.
#细心的伙伴还可以发现,在views.py中在使用默认endpoint的前提下,我们是没有办法使用同一个视图方法名的(当然我们也不建议在同一个文件中有两个视图方法名相同,
#尽管指向他们的request.url不同),但是使用了蓝图之后我们就可以在不同模块中使用相同的方法名了,例如add,show..
3.到此我们就可以通过浏览器测试我们的程序
4.附上使用蓝图后的项目组织结构
当然如果项目不大的话就没有什么必要使用蓝图了,甚至我们可以把除了所有css,js,html的代码都写到一个文件中去,这里我们不在举例,说明.