Catch-All URL示例(烧瓶保持稳定)也捕获/

时间:2018-10-29 11:38:16

标签: python flask flask-restful

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相同的功能。
  • Flask restful API urls答疑人提出两个类作为两个资源。我必须通过resource_class_kwargs关键字参数来初始化该类,并且我只想保留一个实例,所以这对我不利。

我尝试过的事情:

  • 为同一课程创建两个add_resource调用。它以错误结束。
  • 调试add_resource。它显示了它从端点创建了资源视图函数,并将其提供给add_url_rule函数。另外,它的作用与随后的两个add_url_rule函数相同。

1 个答案:

答案 0 :(得分:0)

通过反复试验,我已经找到了解决方案,该解决方案既没有记录在案,也没有达到预期的实现方式(类似于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()