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 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')
这是处理蓝图的最佳方式:
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
的路由。使用 /homeepage
或 Home Class
的任何其他路由会导致错误。不知道是不是只有我一个人。
我想使用 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 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')
这是处理蓝图的最佳方式:
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
的路由。使用 /homeepage
或 Home Class
的任何其他路由会导致错误。不知道是不是只有我一个人。