不抓住权力,任何人都会自卑,就像没有鹿角的雄鹿,在鹿群里没有它的位置;相反,掌握权力的人,曾经高不可攀的女孩会变成尘埃里的泥偶,高高在上的死敌也会对你跪地求饶,这就是权力。你可以说它是魔鬼,但是每个人都会因为得到它而狂喜。尝到了甜头的人就会爱上这东西,渴望把越来越多的权与力握在手中。

任何一个项目都有多个功能,每个功能都应该有自己的分门别类,若是所有的功能的代码都挤在一个函数中会显得比较臃肿,不方便维护。为了解决这个问题,Flask引进了Blueprint这个概念。可以分别定义模块的视图、模板、视图等等,我们可以使用blueprint进行不同模块的编写,不同模块之间有着不同的静态文件、模板文件、view文件,十分方便代码的维护和管理。

举个例子,你可以创建三个蓝图,每个蓝图对应不同的功能,每个蓝图下面有静态文件,视图函数和模板文件,蓝图之间可以相互导入,并且使用蓝图来注册路由。大概的目录结构如下

蓝图结构

其中每个项目下面的init初始化文件可以负责做初始化导入工作,避免在run.py文件中拥挤太多的代码。

基础使用

关于如何让文件夹变成Python的可导入的包,只要在该文件夹下面创建init文件,然后导入即可。比如我的run文件就是从web目录的init文件导入create_app的包。

web目录下的文件

init.py:

# -*- coding: utf-8 -*-
# @Time    : 2018/7/19 0019 18:41
# @Author  : Langzi
# @Blog    : www.sxadmin.github.io
# @File    : __init__.py.py
# @Software: PyCharm
import sys
from flask import Flask
reload(sys)
sys.setdefaultencoding('utf-8')

def create_app():
# 该函数实例化app对象,并且创立指向的模板文件
    app = Flask(__name__,template_folder=('templates'))
    app.config.from_object('config')
    # 加载配置文件
    Blueprint(app)
    # 调用下面的注册蓝图函数
    return app
    # 返回结果

def Blueprint(app):
# 该函数的作用是注册蓝图
    from app.web.Mmzi import web
    # 从app目录下的web目录下的Mmzi文件中导入web
    # 在Mmzi.py文件中导入了Blueprint库,并且实例化了web = Blueprint('web',__name__)
    app.register_blueprint(web)
    # 注册蓝图

该init文件的作用是实例化app对象,创建app对象相关的配置,然后从主程序中导入蓝图的实例化对象,并且注册蓝图实例化对象。

run.py:

# -*- coding: utf-8 -*-
# @Time    : 2018/7/19 0019 18:38
# @Author  : Langzi
# @Blog    : www.sxadmin.github.io
# @File    : run.py
# @Software: PyCharm
import sys
from web import create_app
# 在web目录下导入init文件中的create_app函数
reload(sys)
sys.setdefaultencoding('utf-8')
app = create_app()
# 结果实例化

if __name__ == '__main__':
    app.run(host='0.0.0.0',debug=app.config['DEBUG'])

web目录下的文件

在Mmzi.py主程序中多了这么两行代码:

from flask import Blueprint
web = Blueprint('web',__name__)

然后运行run.py效果与之前的Flask-Mmzi最初始的版本效果一样。

简单来说,Blueprint就是通过url找到view的一套机制,并没有太过于复杂的逻辑。

简洁用法

上面的方法每次在web文件夹创建新的文件都要创建新的实例化对象,有点复杂,此次标准用法可以在init文件重新初始化,更加简便。在web目录下的init文件对web目录下的项目文件的蓝图集合在一个规划。

蓝图结构1

web目录下的文件

Mmzi.py:

该项目主要用作主程序接受参数,处理参数,然后返回数据给渲染页面

# -*- coding: utf-8 -*-
# @Time    : 2018/7/17 0017 21:06
# @Author  : Langzi
# @Blog    : www.sxadmin.github.io
# @File    : Mmzi.py
# @Software: PyCharm
import sys
from flask import Flask,make_response,request,Response,render_template
import time,re
import requests
from flask import Blueprint
from . import web
# 从当前的init文件中导入实例化的蓝图
reload(sys)
sys.setdefaultencoding('utf-8')



def meizi(id):
    headerss = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'
    }
    headers = {'Content-Type':'html/text'}
    r = requests.get(url=str('http://www.mzitu.com/search/' + str(id)),headers=headerss)
    print r.url
    rr = re.findall("data-original='(.*?)' /></a><span><a.*?href=\"(.*?)\" target=\"_blank\">(.*?)</a></span><span",r.content,re.S)
    return rr


@web.route('/index/')
def index():
    return render_template('index.html')



@web.route('/search/',methods=['POST','GET'])
def search():
    if request.method == 'POST':
        idx = request.form['idx']
        return render_template('result.html', data=meizi(idx))
    else:
        return render_template('404.html')

imginfo.py:

该项目作用主要是返回图片信息,但是暂时懒得写代码,就直接返回渲染后的404页面

# -*- coding: utf-8 -*-
# @Time    : 2018/7/19 0019 19:36
# @Author  : Langzi
# @Blog    : www.sxadmin.github.io
# @File    : Imginfo.py
# @Software: PyCharm
import sys
import requests
from . import web
from flask import render_template
reload(sys)
sys.setdefaultencoding('utf-8')

@web.route('/imginfo')
def imginfo():
    return render_template('404.html')

init.py:

# -*- coding: utf-8 -*-
# @Time    : 2018/7/19 0019 18:41
# @Author  : Langzi
# @Blog    : www.sxadmin.github.io
# @File    : __init__.py.py
# @Software: PyCharm

from flask import Blueprint

web = Blueprint('web',__name__)

from app.web import Mmzi
from app.web import Imginfo

主目录下的文件

run.py:

# -*- coding: utf-8 -*-
# @Time    : 2018/7/19 0019 18:38
# @Author  : Langzi
# @Blog    : www.sxadmin.github.io
# @File    : run.py
# @Software: PyCharm
import sys
from app import create_app
reload(sys)
sys.setdefaultencoding('utf-8')
app = create_app()

if __name__ == '__main__':
    app.run(host='0.0.0.0',debug=app.config['DEBUG'])

init.py:

# -*- coding: utf-8 -*-
# @Time    : 2018/7/19 0019 18:36
# @Author  : Langzi
# @Blog    : www.sxadmin.github.io
# @File    : __init__.py.py
# @Software: PyCharm
import sys
from flask import Flask
reload(sys)
sys.setdefaultencoding('utf-8')

def create_app():
    app = Flask(__name__,template_folder=('web/templates'))
    app.config.from_object('config')
    Blueprint(app)
    return app

def Blueprint(app):
    from app.web.Mmzi import web
    app.register_blueprint(web)

config.py:

# -*- coding: utf-8 -*-
# @Time    : 2018/7/17 0017 20:42
# @Author  : Langzi
# @Blog    : www.sxadmin.github.io
# @File    : config.py
# @Software: PyCharm
import sys

reload(sys)
sys.setdefaultencoding('utf-8')

DEBUG = True

该方法非常简便,新建项目蓝图首先在当前目录下的init下实例化蓝图对象,然后在该目录下的项目文件导入init。最后在主项目的根目录中的init文件增加初始化的蓝图对象即可。