Flask-restful 中的 Catch-All URL 示例也捕获 /

Catch-All URL example in flask-restful also catching /

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.

类似问题:

我尝试过的:

通过反复试验,我找到了解决方案,该解决方案既没有记录在案,也不像预期的做法(与 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()