Python REST API Проблемы с числовым типом параметров маршрута - PullRequest
1 голос
/ 16 мая 2019

Я начинаю новый проект на Python, чтобы помочь мне в изучении языка. Я разработчик C # и очень хорошо разбираюсь в REST API, но я чувствую, что чего-то не хватает в Python. Я пишу это с помощью Flask-RESTPlus и приводил следующие примеры, чтобы заставить его работать. В настоящее время у меня есть работающий API, но я пытаюсь разобраться с этой последней частью.

Мне нужно иметь возможность создавать конечную точку API, которая принимает числовой параметр маршрута, независимо от того, является ли он целым числом типа float.

Я могу заставить мой API работать правильно, если добавлю несколько маршрутов, но должен быть лучший способ.

Одна из моих конечных точек:

ns_area = Namespace('Area', description='Area calculations')
@ns_area.route('/Acre/<float:input>/ToSquareFoot')
class ConversionsArea(Resource):
    def get(self, input):
        input = float(input)
        return area.acre_to_ft2(input)

Это возвращает правильный расчет

curl -X GET "http://127.0.0.1:5000/api/v1/Area/Acre/1.2/ToSquareFoot" -H "accept: application/json"

Возвращает 404, поскольку параметр маршрута не является числом с плавающей точкой

curl -X GET "http://127.0.0.1:5000/api/v1/Area/Acre/1/ToSquareFoot" -H "accept: application/json"

Кроме того, если у меня нет идентификатора типа, по умолчанию используется строка.

Я бы действительно не хотел дублировать такие маршруты.

ns_area = Namespace('Area', description='Area calculations')
@ns_area.route('/Acre/<float:input>/ToSquareFoot')
@ns_area.route('/Acre/<int:input>/ToSquareFoot')
class ConversionsArea(Resource):
    def get(self, input):
        input = float(input)
        return area.acre_to_ft2(input)

1 Ответ

1 голос
/ 16 мая 2019

Вы можете использовать string в пути и оценить, может ли оно быть преобразовано в float.Если нет, поднимите ValueError и напечатайте правильное сообщение.

ns_area = Namespace('Area', description='Area calculations')
@ns_area.route('/Acre/<string:input>/ToSquareFoot')
class ConversionsArea(Resource):
    def get(self, input):
        try:
            input = float(input)
            return area.acre_to_ft2(input), 200
        except ValueError:
            return "Can't convert {} to number".format(input), 400
...