首页 > 解决方案 > 在 Flask-Restful 中使用蓝图有什么好处?

问题描述

我是 Flask 和这个Blueprint概念的新手。我了解Blueprint在普通 Flask 应用程序中使用的好处。然而,在阅读了许多帖子/博客/文档之后,Blueprint我仍然不清楚使用 Flask-Restful 的好处。

让我们考虑Flask-Restful 文档中的两个示例。第一个:

from flask import Flask
from flask_restful import Api
from myapi.resources.foo import Foo
from myapi.resources.bar import Bar
from myapi.resources.baz import Baz

app = Flask(__name__)
api = Api(app)

api.add_resource(Foo, '/Foo', '/Foo/<string:id>')
api.add_resource(Bar, '/Bar', '/Bar/<string:id>')
api.add_resource(Baz, '/Baz', '/Baz/<string:id>')

我们有 3 个资源。我们注册它们并启动项目。在这一点上一切都清楚了。我会对这种方法感到满意。

然后,他们使用蓝图:

from flask import Flask, Blueprint
from flask_restful import Api, Resource, url_for

app = Flask(__name__)
api_bp = Blueprint('api', __name__)
api = Api(api_bp)

class TodoItem(Resource):
    def get(self, id):
        return {'task': 'Say "Hello, World!"'}

api.add_resource(TodoItem, '/todos/<int:id>')
app.register_blueprint(api_bp)

据我所知,代码变得越来越复杂:

user_bp = Blueprint('user', __name__)
user_api = Api(user_bp)
user_api.add_resource(User, '/user/<int:id>')
app.register_blueprint(user_bp)

那么,在这里使用蓝图有什么好处呢?

标签: pythonflask

解决方案


blueprintin是将FlaskFlask 应用程序构造成子集的对象。这有助于组织代码和分离功能。

为此Flask-RESTful可用于为您的 api 创建应用程序子集。因此,例如,您有一个核心蓝图、一个身份验证蓝图以及一个 API 蓝图。当您创建一个新版本的 api 破坏与第一个版本的向后兼容性时,它也很有用。在这种情况下,您可以为新版本创建第二个蓝图。

您不必为您创建的每个 api 端点创建新的蓝图,您可以为每个端点重用 api 蓝图,例如:

from flask import Flask, Blueprint
from flask_restful import Api, Resource, url_for

app = Flask(__name__)
core_bp = Blueprint('core', __name__)
api_bp = Blueprint('api', __name__)
api = Api(api_bp)

@core_bp.route('/')
def index():
    return 'Index'

class TodoItem(Resource):
    def get(self, id):
        return {'task': 'Say "Hello, World!"'}

api.add_resource(TodoItem, '/todos/<int:id>')
api.add_resource(User, '/user/<int:id>')

app.register_blueprint(core_bp)
app.register_blueprint(api_bp, url_prefix='/api')

像这样,您的核心应用程序可以通过“/”访问,api 可以通过“/api”访问。


推荐阅读