第18课:Flask BluePrint(蓝图)实现MVC代码架构

FLASK  BluePrint(蓝图)实现MVC代码架构
首先我们需要安装必要的依赖包,比如flask MySQLdb等

最终实现的代码结构如下:
admin #应用1 (这里admin表示后台)
	|-- __init__.py #空文件,表示是个module
	|-- admin.py #control层,注册蓝图,编写业务逻辑
app #应用2 提供api接口
	|-- __init__.py #空文件,表示是个module
	|-- app.py #control层,注册蓝图,编写业务逻辑
conf #配置文件
	|-- __init__.py #空文件,表示是个module
	|-- conf.py #配置文件
index.py #唯一入口文件
lib #放置各种依赖,通用库文件
	|-- __init__.py #空文件,表示是个module
	|-- xxx.py #依赖文件
model #model层,写缓存 DB操作等
	|-- __init__.py #空文件,表示是个module
	|-- xxx.py #model文件
static #静态文件 一般为css js文件
	css
	js
	plugin
templates #模板文件flask默认存放路径
	admin
		|-- index.html #view层文件

我们从入口文件index.py开始,看看这套结构是如何运作的

index.py代码:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from flask import Flask
from admin import admin
from app import app

index = Flask(__name__)
index.config.from_pyfile('conf/conf.py')
appkey = index.config['APPKEY']#获取配置文件值方法
index.register_blueprint(admin.admin)
index.register_blueprint(app.app)

@index.errorhandler(404)#异常处理
def not_found(e):
    return '请求不存在'#这里可以展示404模板页面,可以返回json,看你需要

if __name__ == '__main__':
    index.run(debug = True, threaded = True)#此处threaded=True为多线程启动

然后我们进入应用1:admin
admin.py 代码:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from flask import Blueprint, render_template, abort

admin = Blueprint(
    'admin',
    __name__,
    static_folder = 'static',
    url_prefix = '/admin')

@admin.route('/')
def index():
    #todo:逻辑操作
    return render_template('admin/index.html')


可以看到,这里会展示index.html

templates/admin/index.html  代码:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
index
</body>
</html>

运行代码,浏览器输入:http://127.0.0.1:5000/admin/  会看到显示一个index

然后我们进入应用2:app
app.py代码:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from flask import Blueprint, current_app, request
import json

app = Blueprint('app', __name__)

@app.route('/', methods = ['GET', 'POST'])
def index():
    #todo:逻辑操作
    if request.method == 'POST':#如何获取参数
        param = request.values.get('param')
        if param == '':
            param = request.form.get('param')
    else:
        param = request.args.get('param')
    appkey = current_app.config['APPKEY']#获取配置文件值方法
    res = {'code' : 1000, 'msg' : '操作成功'}
    return json.dumps(res)

@app.errorhandler(404)#异常处理
def not_found(e):
    res = {'code': 2000, 'msg': '请求不存在'}
    return json.dumps(res)

运行代码,浏览器输入:http://127.0.0.1:5000/ 我们会看到:{"msg": "\u64cd\u4f5c\u6210\u529f", "code": 1000}

当然了,以上代码结构适合多个应用公用一套配置,彼此有关联,这也是大部分项目的特性

如果多个应用彼此毫无关联,蓝图也支持创建多个无关联应用,那又是另一套代码结构了,这里不再累述