在第三方框架中,源响应函数被包装如下:
from flask import Response
def wrap_func(func):
def add_context(*args, **kwargs):
output_value = func(*args, **kwargs)
return Response(
output_value
)
return add_context
开发人员可以使用这个装饰器来创建一个类似于入口点的自定义函数:
@wrap_function
def hello():
return '<b>Hello</b>'
框架创建响应并发送它,此功能隐藏在“幕后”。
现在我需要设置一些Response
参数,例如我的函数hello
中的cookie。由于不更改包装器似乎是不可能的,因此我决定为该框架做出贡献。
不过,我的第一个想法是使用响应参数从包装函数 (hello
) 返回一个可选值,然后在 add_context
中解析它。请注意,向后兼容性很重要,“老式”函数应该和"new"函数一样工作,带有响应参数。因此,除了 hello
之外,wrapper 还必须支持这样的功能:
@wrap_function
def ping():
return '<b>Hello</b>', {'cookies': [('te', 'st')]}
但对我而言,这绝对是一项黑客工作。也许有一些最佳实践可以实现此类更改,或者有更好的方法来修改包装函数的返回值而不失兼容性?
最佳答案
最后我决定让它变得简单灵活。现在包装函数应该像往常一样返回一个 markdown 或 Response
对象并用 markdown 主体初始化。然后,在包装器内部,根据 isinstance
执行不同的操作。
from flask import Response
def wrap_func(func):
def add_context(*args, **kwargs):
output_value = func(*args, **kwargs)
if isinstance(output_value, Response):
return output_value
else:
return Response(
output_value
)
return add_context
虽然在这个最小的示例包装器之外需要修改响应主体,但它在基于 Response
创建 CustomResponse
并重新定义所需的操作之后工作。
关于python - 在不失去向后兼容性的情况下向包装函数添加第二个返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48026938/