在我们的Django应用中,我们有很多代码块,如果从数据库中获取的值为None
,我们希望在其中引发异常。
我们当然可以为此行为编写一个自定义访问器,但是为了使那些代码块保持简单,我们用猴子Model
进行了修补:
def raise_error_on_none_model_values(func):
@wraps(func)
def wrapped(*args, **kwargs):
# execute function if already patched
already_patched = (
Model.__getattribute__ == _getattribute_raising_if_value_is_none
)
if already_patched:
return func(*args, **kwargs)
# patch
Model.__getattribute__ = _getattribute_raising_if_value_is_none
# execute function
try:
return func(**kwargs)
finally:
del Model.__getattribute__
return wrapped
但是,(当然!)使用线程时会遇到问题。
我已经调查了诸如wrapt或gevent之类的库是否可以提供帮助,但是我不确定它们是否可以提供帮助。
是否可以制作线程安全的猴子补丁?有没有更好的方法来实现我们想要的目标?