Пример Catch-All URL в флеш-отдыхе также ловит / - PullRequest
0 голосов
/ 29 октября 2018

Существует пример универсального URL для 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 в флеш-отдыхе Аскер не хочет перехватывать / или, по крайней мере, не в тех же функциях, что и другие URL-ы.
  • URL-адреса API для проверки состояния колбы Ответчик предлагает два класса в качестве двух ресурсов . Я должен инициализировать класс с помощью resource_class_kwargs аргумента ключевого слова и Я хочу сохранить только один экземпляр, так что это не будет хорошо для меня .

Что я пробовал:

  • Создайте два add_resource вызова для одного и того же класса. Это заканчивается ошибкой.
  • Отладка add_resource. Он показывает, что он создает функцию просмотра ресурсов из конечной точки, и она передается функции add_url_rule. В противном случае он работает так же, как две последующие функции add_url_rule.

1 Ответ

0 голосов
/ 31 октября 2018

Методом проб и ошибок я нашел решение, которое не документировано и не похоже на ожидаемый способ его выполнения (аналогично тому, как показано в вопросе во Flask).

Необходимо указать Pythonic-аргумент по умолчанию для get() и других функций: 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()
...