我有一个对象,它包装了我的代码库中经常使用的一些 Active Directory 函数。我有一个方便的功能来创建它,但每次它都会创建一个速度慢且效率低下的 SSL 连接。在某些地方我可以改进它的方法是将它传递给循环中的函数,但这并不总是很方便。
该类是无状态的,因此它是线程安全的,并且可以在每个 Django 实例中共享。它应该保持其 AD 连接至少几分钟,最好不要超过一个小时。我还想对其他非 AD 对象执行相同的操作。
我已经使用了各种缓存类型,包括内存中的缓存,将它们用于功能对象是否合适?我认为它们只适用于(可序列化的)数据。
或者:是否有适合服务定位器或连接池的 Django 模式,就像您在 Java 应用程序中经常看到的那样?
谢谢, 乔尔
请您参考如下方法:
我找到了一个看起来运行良好的解决方案,它只是一个类似于 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?
很高兴听到替代方案 :)
