我想使用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
失败。
答案 0 :(得分:4)
您需要pass the blueprint到Api
个实例,而不是应用。
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
或任何其他路由会导致错误。不确定是不是只有我。