首页 > 解决方案 > 从 Flask 中的辅助方法返回 HTTP 响应

问题描述

我不知道如何用谷歌搜索,但基本上我有一个 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(),这样它就可以直接返回响应了吗?或者我可以劫持返回语句来指定我是想返回给用户还是只返回调用方法?

希望这是有道理的。

标签: flaskflask-restful

解决方案


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"

这是一个更好的关注点分离


推荐阅读