Python 我可以在烧瓶中计算出参数检查和响应吗?

Python 我可以在烧瓶中计算出参数检查和响应吗?,python,flask,Python,Flask,我目前正在重构一个更大的代码库,它使用Flask。我在参数检查中看到很多重复。与此类似: @api.route(“/foo/bar/”) def get_foo(内容id): 尝试: 内容=获取内容(内容id) 除: 返回jsonify({“status”:404,“error”:“notfound”}),404 ... @api.route(“/foo/bar//update”) def更新\u foo(内容\u id): 试试看:#这完全一样! content=get_content(con

我目前正在重构一个更大的代码库,它使用Flask。我在参数检查中看到很多重复。与此类似:

@api.route(“/foo/bar/”)
def get_foo(内容id):
尝试:
内容=获取内容(内容id)
除:
返回jsonify({“status”:404,“error”:“notfound”}),404
...
@api.route(“/foo/bar//update”)
def更新\u foo(内容\u id):
试试看:#这完全一样!
content=get_content(content_id)#它只是复制粘贴的
除了:#这样会有很多重复
返回jsonify({“status”:404,“error”:“notfound”}),添加404#!我想减少这个。
...
检查时间更长,检查次数更多,但我希望这能很好地说明这个问题

是否有可能将此检查因素考虑在内?也许用一个装饰师?那会是什么样子

我想要什么 我希望有这样的东西:

def get_content_validator():
尝试:
内容=获取内容(内容id)
除:
返回jsonify({“status”:404,“error”:“notfound”}),404
返回内容
@api.路线(“/foo/bar/”)
def get_foo(内容id):
...
@api.route(“/foo/bar//update”)
def更新_foo(内容):
...

问题是,在一种情况下,返回值并正常执行
get\u foo
/
update\u foo
,而在其他情况下,
get\u foo
/
update\u foo
的函数体不执行。这可以通过检查返回类型来实现。如果是“response”返回类型,则给出响应。在所有其他情况下,它只是返回。但这听起来好像会导致其他问题。

我只是想做一个装饰师:

from functools import wraps

def validated_content(func):
    @wraps(func)
    def wrapper(content_id, *args, **kwargs):
        try:
            content = get_content(content_id)
        except:
            return jsonify(...)
        return func(content, *args, **kwargs)
    return wrapper
然后你的处理者变成:

@api.route("...")
@validated_content
def get_foo(content):
    # do stuff with content

我只是做一个装饰师:

from functools import wraps

def validated_content(func):
    @wraps(func)
    def wrapper(content_id, *args, **kwargs):
        try:
            content = get_content(content_id)
        except:
            return jsonify(...)
        return func(content, *args, **kwargs)
    return wrapper
然后你的处理者变成:

@api.route("...")
@validated_content
def get_foo(content):
    # do stuff with content

我不是专家,但我认为在我的案例中,我希望在每次命中任何特定端点时检查身份验证,因为我使用了decorator,如果有任何错误,它将返回正常执行。我对“required_parameters”做了同样的处理,如果端点需要必填字段,那么它将通过decorator进行检查。我不是专家,但我认为在我的情况下,我希望在每次命中任何特定端点时都检查身份验证,因为我使用了decorator,它会在出现任何错误时返回,否则将正常执行。我对“required_parameters”也做了同样的处理,如果端点需要required字段,那么它将通过decorator检查函数是否有不同类型的参数。我能以某种方式只获取content_id参数吗?@MartinThoma这里有它的多个实现,有一个look@MartinThoma我为包装函数添加了
args
kwargs
参数。这样,签名的其余部分将被转发;装饰师只会将第一个参数从
content\u id
转发到
content
。@tzaman谢谢:-)我刚刚用kwargs解决了这个问题。。。我想我不需要
args
那么,是吗?
args
只有在您直接传递位置args时才是必需的。我相信flask框架应该只支持
kwargs
,因为它只是转发参数字典。函数有不同类型的参数。我能以某种方式只获取content_id参数吗?@MartinThoma这里有它的多个实现,有一个look@MartinThoma我为包装函数添加了
args
kwargs
参数。这样,签名的其余部分将被转发;装饰师只会将第一个参数从
content\u id
转发到
content
。@tzaman谢谢:-)我刚刚用kwargs解决了这个问题。。。我想我不需要
args
那么,是吗?
args
只有在您直接传递位置args时才是必需的。我相信flask框架应该只支持
kwargs
,因为它只是转发参数字典。