Flask-Restful忽略蓝图的url_prefix

时间:2015-09-09 19:56:22

标签: python flask flask-restful

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

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')

我可以找到的所有documentation说现在可以在/buildings/<int:id>/jacks/<int:id>使用这些内容,但这两个网址都是404,而我可以在{{1 }}。对/<int:id>中的路径进行硬编码可以修复它,但会使add_resource失败。

3 个答案:

答案 0 :(得分:4)

您需要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')

答案 1 :(得分:1)

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

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)

你应该将Blueprint'instance发送给Api

答案 2 :(得分:0)

我不知道为什么,但我在使用答案中提到的 Blueprint 时遇到了困难。

但这里有一个快速解决方案,这是我在浏览 doc link 时发现的。在 prefix 中使用 Api() 参数可以完成这项工作。

app = Flask(__name__)

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

现在,您的所有路由都将以 /buildings 为前缀。只要确保在您可能只使用过 url_for('link') 的地方使用 /link

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