Использование функций маршрутизации Flask-restful правильно?

Я могу получить доступ к /v1/folder, но не могу получить доступ к /v1/folder/<folder-id>. Не могли бы вы сказать мне причину? В документе flask-request говорится add_resource() может маршрутизировать несколько URI. Но я не могу. Может быть, я что-то неправильно понимаю. Пожалуйста, скажите мне, если вы найдете ключ.

from flask import request
from flask_restful import Resource, abort

class Folder(Resource):
  def post(self, folder_id):
      return { "message":"post with folder_id"}, 200


  def post(self):
      return { "message":"post without folder_id"}, 201



app = Flask(__name__)

.....

api_bp = Blueprint('api', __name__)
api = Api(api_bp, serve_challenge_on_401=True)
api.add_resource( Folder, '/v1/folder', '/v1/folder/<string:folder_id>')
app.register_blueprint(api_bp)

if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True )

Сообщения об ошибках: «TypeError: post () получил неожиданный аргумент ключевого слова «folder_id»». Что случилось?


person Jinho Yoo    schedule 07.12.2015    source источник


Ответы (1)


Python не поддерживает перегрузку функций/методов, поэтому метод post, который вы объявили последним, всегда будет использоваться. Вместо этого вы должны использовать инструменты, которые предоставляет Python — значения по умолчанию для аргументов.

Я бы лично сделал следующее:

from flask import request
from flask_restful import Resource, abort

class Folder(Resource):
  def post(self, folder_id=None):
      if folder_id is None:
          return self.__simple_post()
      else:
          return self.__parameter_post(folder_id)

  def __parameter_post(self, folder_id):
      return { "message":"post with folder_id"}, 200

  def __simple_post(self):
      return { "message":"post without folder_id"}, 201



app = Flask(__name__)

.....

api_bp = Blueprint('api', __name__)
api = Api(api_bp, serve_challenge_on_401=True)
api.add_resource( Folder, '/v1/folder', '/v1/folder/<string:folder_id>')
app.register_blueprint(api_bp)

if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True )

Или вы могли бы обработать логику в методе post, если логика достаточно похожа и не слишком длинна. Однако, если логика окажется нечитаемой, рассмотрите возможность использования предложенного мной подхода.

person Kendas    schedule 07.12.2015
comment
Добро пожаловать. На самом деле мне пришлось сделать это несколько дней назад, поэтому я до сих пор помню, как я с этим справился. - person Kendas; 07.12.2015