如何在Django中将共享功能对象保留在内存中?

时间:2017-01-25 04:45:24

标签: python django caching

我有一个包装一些Active Directory函数的对象,这些函数在我的代码库中经常使用。我有一个便利功能来创建它,但每次创建一个缓慢且低效的SSL连接。我可以在某些地方改进它的方法是将它传递给循环中的函数,但这并不总是方便的。

该类是无状态的,因此它是线程安全的,可以在每个Django实例中共享。它应该保持其AD连接至少几分钟,理想情况下不超过一小时。还有其他非AD对象我想做同样的事情。

我使用过各种缓存类型,包括内存,是否适合将它们用于功能对象?我认为它们仅用于(可序列化)数据。

或者:是否有一个Django适合的服务定位器模式或连接池,就像你在Java应用程序中经常看到的那样?

谢谢, 乔尔

1 个答案:

答案 0 :(得分:2)

我找到了一个似乎运行良好的解决方案,它只是一个类似于Java中的静态变量的Python功能。

def get_ad_service():
    if "ad_service" not in get_ad_service.__dict__:
        logger.debug("Creating AD service")
        get_ad_service.ad_service = CompanyADService(settings.LDAP_SERVER_URL,
                            settings.LDAP_USER_DN,
                            settings.LDAP_PASSWORD)

        logger.debug("Created AD service")
    else:
        logger.debug("Returning existing AD service")

    return get_ad_service.ad_service

我的代码已经调用此函数来获取AD服务的实例,因此我不必再做任何事情来使其持久化。

我在这里找到了这个和类似的解决方案:What is the Python equivalent of static variables inside a function?

很高兴听到其他选择:)