Flask-Restful 忽略蓝图的 url_prefix

Flask-Restful ignores blueprint's url_prefix

我想使用 Flask 蓝图将我的 Flask-Restful 资源组织成单独的 url 前缀。无论我设置什么 url 前缀(在蓝图创建或注册期间),所有内容都会映射到原始路由路径。如何正确使用 Restful 和蓝图?

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

api.add_resource(Building, '/<int:id>', endpoint='building')
api.add_resource(Jack, '/<int:id>', endpoint='jack')

building_api = Blueprint('building_api', __name__)
jack_api = Blueprint('jack_api', __name__)

app.register_blueprint(building_api, url_prefix='/buildings')
app.register_blueprint(jack_api, url_prefix='/jacks')

All documentation I can find 说这些现在应该在 /buildings/<int:id>/jacks/<int:id> 可用,但是这两个 urls 404 而不是我可以访问/<int:id> 的一号楼。硬编码 add_resource 中的路径修复了它,但打败了 url_prefix.

的要点

您需要 pass the blueprintApi 实例,而不是应用程序。

building_bp = Blueprint('buildings', __name__)
building_api = Api(building_bp)
building_api.add_resource(Building, '/<int:id>')
app.register_blueprint(building_bp, url_prefix='/buildings')

这是处理蓝图的最佳方式:

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

我不知道为什么,但我很难使用答案中提到的 Blueprint

但这是我在 doc link 中找到的 快速解决方案 。使用 Api() 中的 prefix 参数可以完成这项工作。

app = Flask(__name__)

api = Api(app, prefix='/buildings')

现在,您所有的路线都将以 /buildings 为前缀。只需确保在可能只使用 /link.

的地方使用 url_for('link')

我注意到的一件更奇怪的事情是,至少对我来说,直到我将我的路由重命名为与它们的 class 名称相同的名称,它才起作用。例如,Class Home(Resource) 应该有一个到 /home 的路由。使用 /homeepageHome Class 的任何其他路由会导致错误。不知道是不是只有我一个人。