我们在 Django 1.9 应用程序中使用了第三方库。我们想用原始应用程序(针对 MongoDB)中没有的一些功能修改该应用程序。我们目前通过我们自己的原始库的分支来执行此操作,但希望使更改更加正交,以便最终将它们拉到上游。
我们已经尝试在应用 config ready()
期间进行修补,但模型导入是在 django.apps.registry.populate()
调用之前处理的,并执行它在 \__init__
中受到 apps_ready == False
的影响。生命周期中执行此操作的最佳部分是什么?
class MongoConfig(AppConfig):
def __init__(self, app_name, app_module):
super(MongoConfig, self).__init__(app_name, app_module)
for p in patches:
patch(*p)
def patch(old, new):
old_module, old_item = split_mod(old)
new_module, new_item = split_mod(new)
print('patching {0} with {1}'.format(old, new))
old_module = import_module(old_module)
new_module = import_module(new_module)
setattr(old_module, old_item, getattr(new_module, new_item))
最佳答案
我真的不赞成猴子补丁(除了在测试用例期间,即使那样我也相信 mock 更好)。
您为什么不尝试更简单的选项呢?在您的项目中创建应用程序的代理(由于 Python 的查找系统,它将首先被调用)然后简单地修补您想要的方法,并将您不需要的方法绕过原始应用程序。
因此,如果该组件名为“FooProject”,您将在您的项目中创建另一个名为“FooProject”的应用程序,在此应用程序的 __init__.py
中:
from originalproject import FooProject as OriginalFoo
class FooProject(OriginalFoo):
def override_method_here(self, foo):
return my_own_magic(foo)
关于python - 猴子在另一个应用程序中修补 Django 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37074045/