python - 在 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)
据我所知,代码变得越来越复杂:
- 需要更多步骤:使用蓝图创建 API 实例,向应用注册蓝图,...
- 如果我有其他资源,例如
user
,我必须重复所有这些步骤(如果我错了,请纠正我):
user_bp = Blueprint('user', __name__)
user_api = Api(user_bp)
user_api.add_resource(User, '/user/<int:id>')
app.register_blueprint(user_bp)
那么,在这里使用蓝图有什么好处呢?
解决方案
blueprint
in是将Flask
Flask 应用程序构造成子集的对象。这有助于组织代码和分离功能。
为此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”访问。
推荐阅读
- javascript - 如何获取在 jQuery 中使用 $('*selector*).on(...) 的选择器的字符串值?
- arrays - 在 Kotlin 中从字符串创建字节数组
- python - 选择没有“孔”的numpy数组中的行,孔为0(例如...,1,0,1,...)
- instrumentation - 使用 Byte Buddy 扩展 Spring Boot 的类路径
- flutter - 在Android Studio(4.1.2)中编辑drawable时设计模式无限加载
- python - 如何在 PyQtWebEngine 中使用 target="_blank" 打开超链接?
- swift - 从所有接触的身体接触位置
- ruby-on-rails - 弃用警告:ActionView::Base in rails 6.0 for sanitize
- docker - 无法从 docker 容器上托管的主机 IP 调用服务
- discord.js - 我如何让 discord.js 列出角色中的所有成员?