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

mwj*_*son 10 python django django-models django-apps

我们在Django 1.9应用程序中使用了第三方库.我们想要使用一些不在原始应用程序中的功能(针对MongoDB)来修改该应用程序.我们目前通过我们自己的原始库的fork来实现这一点,但是希望使更改更加正交,以便最终可以将它们拉到上游.

我们已经尝试在应用程序期间进行修补,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))
Run Code Online (Sandbox Code Playgroud)

小智 0

猴子补丁是一种黑客行为,难以维护,应该避免。

原则是在导入代码之前、在加载 Django 本身之前修补代码。根据您的入口点,您将找到修补代码的正确位置。

使用 Django 1.9 我可以考虑两个入口点:

  1. wsgi.py - 当您的代码在 WSGI 容器上运行时
  2. manage.py - 运行任何管理命令(shell、runserver、migrate)时