【问题标题】:Flask-Restful ignores blueprint's url_prefixFlask-Restful 忽略蓝图的 url_prefix
【发布时间】:2015-09-09 19:56:21
【问题描述】:

我想使用 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')

我能找到的所有documentation 都说这些现在应该在/buildings/&lt;int:id&gt;/jacks/&lt;int:id&gt; 上可用,但是这两个网址都是404,而我可以通过/&lt;int:id&gt; 访问建筑物之一。在add_resource 中对路径进行硬编码可以修复它,但会破坏url_prefix 的要点。

【问题讨论】:

    标签: python flask flask-restful


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      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

      【讨论】:

        【解决方案3】:

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

        但这是我在查看doc link 时发现的快速解决方案。在Api() 中使用prefix 参数就可以了。

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

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

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

        【讨论】:

          猜你喜欢
          • 2014-07-19
          • 2018-10-23
          • 2012-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多