вернуть HTTP-ответ от вторичного метода во Flask - PullRequest
0 голосов
/ 30 апреля 2019

Я не уверен, как Google это, но в основном у меня есть Flask Restful API, который обычно возвращает ответы, подобные этому:

В моем основном файле:

api.add_resource(my_package.MyClass,'/path/to/some/stuff')

Тогда в my_package.py:

class MyClass(Resource):
    def post(self):
        return "hello world"

Так что в основном этот метод post обрабатывает сообщения, отправленные на /path/to/some/stuff. Но мой код становится немного сложнее, и поэтому я хочу вызывать другие методы (которые НЕ являются ресурсами API) из post(), например:

class MyClass(Resource):

    def validate_something(xyz)
        ...do some validation...
        if (validation_fails):
            return "Your validation has failed!"

    def post(self):
        validate_something(xyz)
        return "hello world"

Проблема в том, что мне кажется, что я не могу вернуть (пользователю, попавшему в мой API) ответ из моего кода, если только он не входит в один из этих методов с поддержкой API, таких как post(). Когда я вернусь "Ваша проверка не удалась!" выше, это не идет к пользователю, это просто идет к post() как возвращаемое значение. Можно ли как-то «обновить» validate_something(), чтобы он мог возвращать ответы напрямую? Или же я могу перехватить оператор return, чтобы указать, хочу ли я вернуться к пользователю или просто вернуться к вызывающему методу?

Надеюсь, это имеет смысл.

1 Ответ

0 голосов
/ 01 мая 2019

return не подключен к вашему конечному пользователю каким-то волшебством - клиент всегда будет получать все, что вы возвращаете из метода представления .Вызов другой функции в вашем представлении не может заставить ваш метод представления вернуться, вы должны сделать это явно.

Вы можете сделать что-то вроде этого:

class MyClass(Resource):

    def validate_something(xyz)
        ...do some validation...
        if (validation_fails):
            return "Your validation has failed!"

    def post(self):
        validation = validate_something(xyz)
        if validation is not None: # if validation passes, validate_something currently has no return value so it will return None
            return validation
        return "hello world"

Однако я неНе думаю, что это делает для лучшего кода.В идеале ваш validate_something метод должен иметь только одну работу: проверять.Не формировать ответы конечных пользователей.Пусть ваш метод представления обрабатывает следующее:

class MyClass(Resource):

    def validate_something(xyz)
        ...do some validation...
        if (validation_fails):
            return False
        return True

    def post(self):
        validated = validate_something(xyz)
        if not validated:
            return "Your validation has failed!"
        return "hello world"

Это гораздо лучшее разделение интересов

...