2016-07-29 7 views
0

Ich muss eine erstellte/offene LDAP-Verbindung speichern, sodass mehrere Modelle, Ansichten usw. eine einzelne Verbindung wiederverwenden können, anstatt jedes Mal eine neue Verbindung zu erstellen. Diese Verbindung sollte offen sein, wenn sie während einer Anfrage zuerst benötigt wird, und geschlossen, wenn eine Antwort gesendet wird (das Erzeugen der Seite wurde beendet). Die Verbindung sollte nicht zwischen verschiedenen Anfragen/Antworten geteilt werden.Speichern und Zugreifen auf Anfrage-Antwort-Wide-Objekt

Wie ist es zu machen? Wo kann die Verbindung gespeichert werden und wie kann sie schließlich geschlossen werden?

Ein bisschen mehr Info. Als zusätzliche Informationsquelle verwende ich LDAP-Verbindungen. LDAP-Daten enthalten Details, die ich nicht in der Datenbank speichern kann (Redundanz-/Konsistenzgründe), z. MS Exchange Mailing Gruppen. Ich benötige möglicherweise einige LDAP-Daten an mehreren Punkten, verschiedene Objekte/Instanzen sollten während der Antwortgenerierung darauf zugreifen.

Antwort

1

Eine Möglichkeit, die Verbindungsressource zu speichern, sodass sie für alle Komponenten gemeinsam genutzt werden kann, ist die Verwendung von thread local storage.

Zum Beispiel in 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 

So das erste Mal myldap.get_ldap_connection wird von einem bestimmten Thread aufgerufen wird die Verbindung geöffnet wird. Nachfolgende Aufrufe von demselben Thread werden die Verbindung erneut verwenden.

Um sicherzustellen, dass die Verbindung geschlossen ist, wenn Sie mit der Arbeit fertig sind, können Sie eine Django middleware component implementieren. Unter anderem können Sie damit einen Hook angeben, der aufgerufen wird after the view has returned it's response object.

kann die Middleware dann myldap.close_ldap_connection() wie folgt aufrufen:

import myldap 

Class CloseLdapMiddleware(object): 
    def process_response(self, response): 
     myldap.close_ldap_connection() 
     return response 

Schließlich müssen Sie Ihre Middleware in settings.pyMIDDLEWARE_CLASSES hinzuzufügen:

MIDDLEWARE_CLASSES = [ 
    ... 
    'path.to.CloseLdapMiddleWare', 
    ... 
] 
+0

Gute Idee, ich habe der Verwendung von Middleware nicht gedacht:) Die Verwendung von Thread Local passt jedoch nicht zu den Konzepten unserer Software, daher werde ich etwas länger warten, bevor ich akzeptiere. – Art

+0

Die einzige Alternative, die ich zur Verwendung von Thread-Local (oder einer Variante davon) kenne, ist die Speicherung von Informationen zum Request-Objekt. Der Nachteil dieses Ansatzes ist jedoch, dass Sie das Request-Objekt dann an jede Funktion übergeben müssen, die die ldap-Verbindung benötigt - was je nach Ihren Anforderungen und der Architektur sehr schwer sein kann. –