一. 初始化项目
二. 建立一个简单的项目
from app.app import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
app/app.py
from flask import Flask
def create_app():
app = Flask(__name__)
app.config.from_object('app.config.secure')
app.config.from_object('app.config.setting')
register_blueprints(app)
return app
def register_blueprints(app):
from app.api.v1.user import user
from app.api.v1.book import book
app.register_blueprint(user)
app.register_blueprint(book)
from flask import Blueprint
book = Blueprint('book', __name__)
@book.route('/v1/book/get')
def get_book():
return 'get book'
from flask import Blueprint
user = Blueprint('user', __name__)
@user.route('/v1/user/get')
def get_user():
return 'i am cannon'
其他文件为空
三. 创建自己的redprint-红图
蓝图适合模块话的构建, 这里的book.py和user.py不适合。 我们可以用自定义红图来构建。
红图的架构图:
新建app/libs/redprint.py,写个空的类
class Redprint:
pass
我们从下往上来构建:
app/api/v1/book.py:
from app.libs.redprint import Redprint
api = Redprint('book')
@api.route('get')
def get_book():
return 'get book'
app/api/v1/user.py:
from app.libs.redprint import Redprint
api = Redprint('user')
@api.route('get')
def get_user():
return 'i am cannon'
蓝图层app/api/v1/init.py
from flask import Blueprint
from app.api.v1 import user, book
def create_blueprint_v1():
bp_v1 = Blueprint('v1', __name__, url_prefix='/v1')
# 蓝图+红图的url_prefix, 缩短了@app.route中的url长度, 简化了代码
user.api.register(bp_v1, url_prefix='/user')
book.api.register(bp_v1, url_prefix='/book')
return bp_v1
核心对象app app/app.py
from flask import Flask
def create_app():
app = Flask(__name__)
app.config.from_object('app.config.secure')
app.config.from_object('app.config.setting')
register_blueprints(app)
return app
def register_blueprints(app):
from app.api.v1 import create_blueprint_v1
app.register_blueprint(create_blueprint_v1())
四. 实现redprint
app/libs/redprint.py:
class Redprint:
def __init__(self, name):
self.name = name
self.mound = []
def route(self, rule, **options):
def decorator(f):
self.mound.append((f, rule, options))
return f
return decorator
def register(self, bp, url_prefix=None):
for f, rule, options in self.mound:
endpoint = options.pop('endpoint', f.__name__) # options里有endpoint,则取出对应的值, 没有endpoint则默认取值 函数的名字。
bp.add_url_rule(url_prefix+rule, endpoint, f, **options)