在第三方框架中,源响应函数包装如下:
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
开发人员可以使用这个decorator来创建一个自定义函数,比如一个入口点:
@wrap_function
def hello():
return '<b>Hello</b>'
框架创建响应并发送,此功能隐藏在“引擎盖下”。你知道吗
现在我需要设置一些Response
参数,比如来自函数hello
的cookies。由于没有包装器的更改似乎是不可能的,所以我决定对框架做出贡献。你知道吗
我的第一个想法是用响应参数从包装函数(hello
)返回一个可选值,然后在add_context
内解析它。注意,向后兼容性很重要,“旧样式”函数应该和“新”函数一样工作,并带有响应参数。因此,除了hello
,包装器还必须支持以下函数:
@wrap_function
def ping():
return '<b>Hello</b>', {'cookies': [('te', 'st')]}
但对我来说,这绝对是一个黑客的工作。也许有一些最佳实践来实现这样的更改,或者更好的方法来修改包装函数的返回而不丢失兼容性?你知道吗
最后我决定用简单灵活的方式。现在,wrapped函数应该像往常一样返回markdown或
Response
对象,并用markdown body初始化。然后,在包装器内部,根据isinstance
执行不同的操作。你知道吗尽管在这个最小的示例之外,包装器需要修改响应主体,但它在基于
Response
创建CustomResponse
并重新定义所需的操作之后才能工作。你知道吗相关问题 更多 >
编程相关推荐