Ticket #6847: filebased.py

File filebased.py, 2.5 KB (added by xinbin <xinbin@…>, 7 years ago)
Line 
1"File-based cache backend"
2
3from django.core.cache.backends.simple import CacheClass as SimpleCacheClass
4import os, time, urllib
5try:
6    import cPickle as pickle
7except ImportError:
8    import pickle
9
10class CacheClass(SimpleCacheClass):
11    def __init__(self, dir, params):
12        self._dir = dir
13        if not os.path.exists(self._dir):
14            self._createdir()
15        SimpleCacheClass.__init__(self, dir, params)
16        del self._cache
17        del self._expire_info
18
19    def get(self, key, default=None):
20        fname = self._key_to_file(key)
21        try:
22            f = open(fname, 'rb')
23            exp = pickle.load(f)
24            now = time.time()
25            if exp < now:
26                f.close()
27                os.remove(fname)
28            else:
29                return pickle.load(f)
30        except (IOError, OSError, EOFError, pickle.PickleError):
31            pass
32        return default
33
34    def set(self, key, value, timeout=None):
35        fname = self._key_to_file(key)
36        if timeout is None:
37            timeout = self.default_timeout
38           
39        namespacedir = os.path.dirname(fname)
40        try:
41            filelist = os.listdir(namespacedir)
42        except (IOError, OSError):
43            self._createdir(namespacedir)
44            filelist = []
45        if len(filelist) > self._max_entries:
46            self._cull(filelist)
47
48        try:
49            f = open(fname, 'wb')
50            now = time.time()
51            pickle.dump(now + timeout, f, 2)
52            pickle.dump(value, f, 2)
53        except (IOError, OSError):
54            pass
55
56    def delete(self, key):
57        try:
58            os.remove(self._key_to_file(key))
59        except (IOError, OSError):
60            pass
61
62    def has_key(self, key):
63        return os.path.exists(self._key_to_file(key))
64
65    def _cull(self, filelist):
66        if self._cull_frequency == 0:
67            doomed = filelist
68        else:
69            doomed = [k for (i, k) in enumerate(filelist) if i % self._cull_frequency == 0]
70        for fname in doomed:
71            try:
72                os.remove(os.path.join(self._dir, fname))
73            except (IOError, OSError):
74                pass
75
76    def _createdir(self, dir = None):
77        if dir == None:
78            dir = self._dir
79        try:
80            os.makedirs(dir)
81        except OSError:
82            raise EnvironmentError, "Cache directory '%s' does not exist and could not be created'" % self._dir
83
84    def _key_to_file(self, key):
85        return os.path.join(self._dir, (key))
Back to Top