Колба restful не может сопоставить ресурс pathparam - PullRequest
1 голос
/ 06 ноября 2019

У меня есть ресурс отдыха в колбе:

api.add_resource(TrainerById, '/api/trainer/<int:uuid>')

с исходным кодом, подобным следующему:

class TrainerById(Resource):
    def get(self):
        data = trainer_by_id_parser.parse_args()
        trainer_uuid = data['uuid']
        new_trainer = Trainer.find_by_uuid(trainer_uuid)
        if not new_trainer:
            return {'msg': f"Trainer with uuid {trainer_uuid} not found"}, 401
        else:
            return {'msg': to_json_trainer(new_trainer)}

Я хочу вернуть профиль тренера trainer сUUID из параметра пути, однако проблема в том, что он возвращает 404 всякий раз, когда я пытаюсь получить доступ к конечной точке, например:

localhost:5000/api/trainer/profile/886313e1-3b8a-5372-9b90-0c9aee199e5d #gives 404

1 Ответ

0 голосов
/ 11 ноября 2019

Вы смешали ресурсную маршрутизацию с разбором аргументов.

Resourceful Routing являются конечными точками приложения.

Ниже приведены примеры различных маршрутов:

  • localhost:5000/api/trainer/
  • localhost:5000/api/trainer/profile
  • localhost:5000/api/trainer/profile/6385d786-ff51-455e-a23f-0699c2c9c26e
  • localhost:5000/api/trainer/profile/4385d786-ef51-455e-a23f-0c99c2c9c26d

Обратите внимание, что последние два можно сгруппировать с помощью ресурсоемкая маршрутизация .

RequestParser - это встроенная поддержка Flask-RESTPlus для запросапроверка достоверности данных. Это могут быть строки запроса или данные, закодированные в форме POST и т. Д.


С помощью предоставленного вами неполного кода необходимые функции могут быть реализованы следующим образом:

from flask import Flask
from flask_restplus import Resource, Api

app = Flask(__name__)
api = Api(app)

# List of trainers, just basic example instead of DB.
trainers = [
    '6385d786-ff51-455e-a23f-0699c2c9c26e',
    '7c6d64ae-8334-485f-b402-1bf08aee2608',
    'c2a427d5-5294-4fad-bf10-c61018ba49e1'
]


class TrainerById(Resource):

    def get(self, trainer_uuid):

        # In here, trainer_uuid becomes <class 'uuid.UUID'>, so you can
        # convert it to string.

        if str(trainer_uuid) in trainers:
            return {'msg': f"Trainer with UUID {trainer_uuid} exists"}, 200
        else:
            return {'msg': f"Trainer with uuid {trainer_uuid} not found"}, 404

# This means after profile/, next expected keyword is UUID with name in route
# as trainer_uuid.
api.add_resource(TrainerById, '/api/trainer/profile/<uuid:trainer_uuid>')

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