1.起步与红图

一. 初始化项目

image

二. 建立一个简单的项目


ginger.py:

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)


book.py:

from flask import Blueprint

book = Blueprint('book', __name__)


@book.route('/v1/book/get')
def get_book():
    return 'get book'

user.py

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)

猜你喜欢

转载自blog.csdn.net/weixin_41207499/article/details/80846901
1.
今日推荐