我需要存储一个已创建/打开的LDAP连接,因此多个模型,视图等可以重用一个连接,而不是每次都创建一个新连接。在请求期间首次需要时,此连接应打开,而在发送响应时(完成生成页面),则应关闭此连接。该连接不应在不同的请求/响应之间共享。
怎么做呢?在哪里存储连接以及如何确保连接最终关闭?
更多信息。作为附加信息源,我使用LDAP连接。LDAP数据包含我无法存储在数据库中的详细信息(冗余/一致性原因),例如MS Exchange邮件组。我可能需要多个点的LDAP数据,在响应生成期间,不同的对象/实例应该访问它。
存储连接资源以便可以在各个组件之间共享的一种方法是使用线程本地存储。
例如,在myldap.py
:
import threading
_local = theading.local()
def get_ldap_connection():
if not hasattr(_local, 'ldap_connection') or _local.ldap_connection is None:
_local.ldap_connection = create_ldap_connection()
return _local.ldap_connection
def close_ldap_connection():
if hasattr(_local, 'ldap_connection') and _local.ldap_connection is not None:
close_ldap_connection(_local.ldap_connection)
_local.ldap_connection = None
因此,第一次myldap.get_ldap_connection
从特定线程调用时,它将打开连接。来自同一线程的后续调用将重用该连接。
为了确保完成工作后关闭连接,您可以实现Django中间件组件。除其他事项外,这将允许您指定一个挂钩,该挂钩在视图返回其响应对象之后被调用。
然后,中间件可以这样调用myldap.close_ldap_connection()
:
import myldap
Class CloseLdapMiddleware(object):
def process_response(self, response):
myldap.close_ldap_connection()
return response
最后,您将需要在以下位置添加中间件settings.py
MIDDLEWARE_CLASSES
:
MIDDLEWARE_CLASSES = [
...
'path.to.CloseLdapMiddleWare',
...
]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句