构建可插拔应用程序:如何包含流行库的分支并防止名称冲突?

时间:2012-08-14 05:44:38

标签: python django plugins namespaces

我正在构建一个我试图保持可插拔的应用程序。唯一的问题是我需要稍微修改django-mailer,以便我的应用可以跟踪已发送/未发送的电子邮件,并可以访问电子邮件内容。

确保这与使用django-mailer的其他人或我决定为我自己的应用程序分叉/调整的任何其他python库不冲突的最佳方法是什么?

我应该在我的分叉中重命名邮件以及所有相关的导入吗?我错过了更容易的东西吗?

1 个答案:

答案 0 :(得分:0)

您可以使用功能解决它。创建一个完成这两件事的函数:

  • 确保您可以随时掌握自己想要的内容
  • 确保邮件已发送。

或者你可以做一些更重的管道。确保记录良好,并尝试让其他人不在家里尝试这个无用的目的,而是联系Django或Django-mailer团队,询问他们是否可以安排更好的解决方案。

  • 从django.core.mail模块中装饰EmailMessage类:确保在成功发送消息时,您所需的信息也会在其他地方传递。

    # wrappedmailer.py
    from django.core.mail import EmailMessage
    
    class WrappedEmailMessage(object):
        def __init__(self, message):
            self.__message = message
            # more initialization
    
        # override all EmailMessage methods:
        # do what you want with what is provided,
        # then return self.__message.method(...)
    
  • 然后,当您的应用程序初始化时,在加载django-mailer之前,您可以执行以下操作:

       import django.core.mail
       import newmailer
    
       django.core.mail.EmailMessage = newmailer.WrappedEmailMessage
    

django.core.mail模块保留在同一个Python进程的缓存中,因此无论何时导入django.core.mail,EmailMessage类实际上都是WrappedEmailMessage类。