python - 猴子在另一个应用程序中修补 Django 应用程序

标签 python django django-models django-apps

我们在 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/

相关文章:

python - 嵌套的 python 装饰器?

jquery - 如何使用 javascript/jquery/AJAX 调用 Django REST API?

python - Django 模型 reload_from_db() 与显式从数据库中调用

django:为什么我们在 modelSerializer 中使用嵌套元类?

python - 输出/打印 "readable"字典

python - 我正在尝试使用 Excel 中的数据用 Python 填写 Web 表单

python - 读取 txt 矩阵时,如何跳过第一列

Django + Google Storage (GCP) 多桶

python-2.7 - Django Meta Class - 将排序应用于用户的模型字段

mysql - Django 重置不删除表