【问题标题】:Catch-All URL example in flask-restful also catching /flask-restful 中的 Catch-All URL 示例也捕获 /
【发布时间】:2018-10-29 11:38:16
【问题描述】:

a catch-all URL example for Flask

from flask import Flask
app = Flask(__name__)

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
    return 'You want path: %s' % path

if __name__ == '__main__':
    app.run()

装饰器可以翻译成以下代码,看起来更类似于 Flask-RESTful 实现相同功能:

app.add_url_rule('/', 'catch_all', catch_all, defaults={'path': ''})
app.add_url_rule('/<path:path>', 'catch_all', catch_all, defaults={'path': ''})

如果我是对的,这可以进一步翻译成等效的 Flask-RESTful 应用程序(至少调试显示它创建了相同的 URL 路由):

class RESTapp(Resource):
    def get(self, path):
        # do get something

api.add_resource(RESTapp, '/', '/<path:path>', defaults={'path': ''})

问题是这个应用程序将所有 URL 重定向到 / 并且我无法在 get() 函数中获取请求的路径。我想在与 Flask 相同的函数中处理所有路径(/ 和 '/'),但使用 Flask-RESTful。

类似问题:

  • Catch-All URL in flask-restful Asker 不想捕捉 / 或者至少不想在与其他 URL-s 相同的功能中。
  • Flask restful API urls Answerer 提出两个类作为两个资源。我必须通过resource_class_kwargs 关键字参数初始化类,并且我只想保留一个实例,所以这对我不利

我尝试过的:

  • 为同一个类创建两个add_resource 调用。它以错误结束。
  • 调试add_resource。它表明它从 Endpoint 创建了一个资源视图函数,并将其提供给 add_url_rule 函数。否则,它的工作原理与随后的两个 add_url_rule 函数相同。

【问题讨论】:

    标签: python flask flask-restful


    【解决方案1】:

    通过反复试验,我找到了解决方案,该解决方案既没有记录也没有看起来像预期的方法(类似于 Flask,在问题中显示)。

    必须为get() 和其他函数提供Pythonic 默认参数:get(stuff='DEF_VAL')

    正在运行的完整示例:

    from flask import Flask
    from flask_restful import Api, Resource
    
    app = Flask(__name__)
    api = Api(app)
    
    class RESTapp(Resource):
    
        @staticmethod
        def get(path=''):  # <-- You should provide the default here not in api.add_resource()!
            return 'You want path: \'%s\'' % path  # do get something
    
    
    api.add_resource(RESTapp, '/', '/<path:path>')  # Here just the URLs must be the arguments!
    
    
    if __name__ == '__main__':
        app.run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2015-04-15
      • 2011-12-28
      相关资源
      最近更新 更多