从Flask中的辅助方法返回HTTP响应

时间:2019-04-30 20:48:49

标签: flask flask-restful

我不确定如何使用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的内容。但是我的代码变得越来越复杂,因此我想从post()调用其他方法(不是API资源),例如:

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 :(得分:0)

return不会因某种魔术而吸引您的最终用户-客户端总是会从view方法中获取您返回的所有 。在视图中调用另一个函数不能强制您的视图方法返回,而必须显式地执行。

您可以执行以下操作:

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方法应该只有一项工作:验证。不形成最终用户的回应。让您的view方法来处理:

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"

这是更好的关注点分离