On Jun 13, 8:38 pm, "Patrick Quinn" <[EMAIL PROTECTED]> wrote:
> I'd like to maintain a resource (python object) between multiple
> requests and multiple users.  In this case, I'd like my app to
> maintain a Jabber connection which is established when it's needed and
> kept as long as possible.  This way the app can IM users as needed
> without having to go through the very expensive process of negotiating
> a connection with a Jabber server every time a message needs to be
> sent.
>
> Does anyone have any ideas of how this might be achieved within Django?

Here is (part of) a class that does something similar. The Imap
instances are stored in a django session, the imap instance variable
is saved in a module level dictionary, and __getstate__ and
__setstate__ methods keep the imap instance variable out of the
pickled representation and try to restore the active imap handles when
unpickling. When unpickling an object that has no corresponding
Imap.imap handle in the module dictionary a new server connection is
created.

_imap_handles = {}
try:
    from mod_python import apache
    _log_notice = lambda a: apache.log_error(a, apache.APLOG_NOTICE)
    _log_error = lambda a: apache.log_error(a)
except ImportError:
    import sys
    _log_error = _log_notice = lambda a: sys.stderr.write("%s\n" % a)

from imaplib import IMAP4_SSL as IMAP4

class Imap(object):

    def __init__(self, host=None, user=None, password=None, key=None):
        self._host, self.user, self._password = host, user, password
        self.key = key
        self.imap = None
        if self.connect():
            _imap_handles[key] = self.imap

    def close(self):
        self.imap.close()
        try:
            del _imap_handles[self.key]
        except:
            pass

    def connect(self):
        _log_notice("imap login %s to %s" % (self.user, self._host))
        try:
            self.imap = imap = IMAP4(self._host)
            if self.user and self._password:
                imap.login(self.user, self._password)
                return imap
        except Exception, e:
            _log_error("login failed for %s: %s" % (self.user,
str(e)))

    def __getstate__(self):
        return dict([(k,v) for k,v in self.__dict__.items() if not
k=='imap'])
    def __setstate__(self, obj):
        self.__dict__.update(obj)
        key = self.key
        self.imap = _imap_handles.get(key)
        if self.imap is None:
            if (self.connect()):
                _imap_handles[key] = self.imap


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to