存储和访问请求 - 响应范围广的对象

时间:2016-07-29 13:49:17

标签: django ldap

我需要存储创建/打开的LDAP连接,因此多个模型,视图等可以重用单个连接,而不是每次都创建一个新连接。此连接应在请求期间首次需要时打开,在发送响应时关闭(生成页面完成)。不应在不同的请求/响应之间共享连接。

这样做的方法是什么?存储连接的位置以及如何确保最终关闭?

更多信息。作为附加信息源,我使用LDAP连接。 LDAP数据包含我无法存储在数据库中的详细信息(冗余/一致性原因),例如MS Exchange邮件组。我可能需要多个点的LDAP数据,不同的对象/实例应该在响应生成期间访问它。

1 个答案:

答案 0 :(得分:1)

存储连接资源以便在整个组件中共享的一种方法是使用thread local storage

例如,在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 middleware component。除此之外,这将允许您指定一个被调用的钩子after the view has returned it's response object

然后,中间件可以像这样调用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',
    ...
]