{ "info": { "author": "Mikhail Korobov", "author_email": "kmike84@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "==================\ndjango-cache-utils\n==================\n\ndjango-cache-utils provides some utils for make cache-related work easier:\n\n* ``cached`` decorator. It can be applied to function, method or classmethod\n and can be used with any django cache backend (built-in or third-party like\n django-newcache).\n\n Supports fine-grained invalidation for exact parameter set (with any backend)\n and bulk cache invalidation (only with ``group_backend``). Cache keys are\n human-readable because they are constructed from callable's full name and\n arguments and then sanitized to make memcached happy.\n\n Wrapped callable gets ``invalidate`` methods. Call ``invalidate`` with\n same arguments as function and the cached result for these arguments will be\n invalidated.\n\n* ``group_backend``. It is a django memcached cache backend with group O(1)\n invalidation ability, dog-pile effect prevention using MintCache algorythm\n and project version support to allow gracefull updates and multiple django\n projects on same memcached instance.\n Long keys (>250) are auto-truncated and appended with md5 hash.\n\nInstallation\n============\n\n::\n\n pip install django-cache-utils\n\nand then (optional)::\n\n # settings.py\n CACHE_BACKEND = 'cache_utils.group_backend://localhost:11211/'\n\nUsage\n=====\n\n`cached` decorator can be used with any django caching backend (built-in or\nthird-party like django-newcache)::\n\n from cache_utils.decorators import cached\n\n @cached(60)\n def foo(x, y=0):\n print 'foo is called'\n return x+y\n\n foo(1,2) # foo is called\n foo(1,2)\n foo(5,6) # foo is called\n foo(5,6)\n foo.invalidate(1,2)\n foo(1,2) # foo is called\n foo(5,6)\n foo(x=2) # foo is called\n foo(x=2)\n\n class Foo(object):\n @cached(60)\n def foo(self, x,y):\n print \"foo is called\"\n return x+y\n\n obj = Foo()\n obj.foo(1,2) # foo is called\n obj.foo(1,2)\n\n\nWith ``group_backend`` `cached` decorator supports bulk O(1) invalidation::\n\n from django.db import models\n from cache_utils.decorators import cached\n\n class CityManager(models.Manager):\n\n # cache a method result. 'self' parameter is ignored\n @cached(60*60*24, 'cities')\n def default(self):\n return self.active()[0]\n\n # cache a method result. 'self' parameter is ignored, args and\n # kwargs are used to construct cache key\n @cached(60*60*24, 'cities')\n def get(self, *args, **kwargs):\n return super(CityManager, self).get(*args, **kwargs)\n\n\n class City(models.Model):\n # ... field declarations\n\n objects = CityManager()\n\n # an example how to cache django model methods by instance id\n def has_offers(self):\n @cached(30)\n def offer_count(pk):\n return self.offer_set.count()\n return history_count(self.pk) > 0\n\n # cache the function result based on passed parameter\n @cached(60*60*24, 'cities')\n def get_cities(slug)\n return City.objects.get(slug=slug)\n\n\n # cache for 'cities' group can be invalidated at once\n def invalidate_city(sender, **kwargs):\n cache.invalidate_group('cities')\n pre_delete.connect(invalidate_city, City)\n post_save.connect(invalidate_city, City)\n\nNotes\n=====\n\nIf decorated function returns None cache will be bypassed.\n\ndjango-cache-utils use 2 reads from memcached to get a value if 'group'\nargument is passed to 'cached' decorator::\n\n @cached(60)\n def foo(param)\n return ..\n\n @cached(60, 'my_group')\n def bar(param)\n return ..\n\n # 1 read from memcached\n value1 = foo(1)\n\n # 2 reads from memcached + ability to invalidate all values at once\n value2 = bar(1)\n\n\nRunning tests\n=============\n\n::\n\n cd test_project\n ./runtests.py", "description_content_type": null, "docs_url": null, "download_url": "http://bitbucket.org/kmike/django-cache-utils/get/tip.zip", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://bitbucket.org/kmike/django-cache-utils/", "keywords": null, "license": "MIT license", "maintainer": null, "maintainer_email": null, "name": "django-cache-utils", "package_url": "https://pypi.org/project/django-cache-utils/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/django-cache-utils/", "project_urls": { "Download": "http://bitbucket.org/kmike/django-cache-utils/get/tip.zip", "Homepage": "http://bitbucket.org/kmike/django-cache-utils/" }, "release_url": "https://pypi.org/project/django-cache-utils/0.7.2/", "requires_dist": null, "requires_python": null, "summary": "Caching decorator and django cache backend with advanced invalidation ability and dog-pile effect prevention", "version": "0.7.2" }, "last_serial": 654360, "releases": { "0.5.0": [ { "comment_text": "", "digests": { "md5": "098019f1e0a4311c4c8fa35b70e6d4d9", "sha256": "65f095e305305486220751fc37f0f4feb97bb5353b6945a7082958096eedce02" }, "downloads": -1, "filename": "django-cache-utils-0.5.0.tar.gz", "has_sig": false, "md5_digest": "098019f1e0a4311c4c8fa35b70e6d4d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5482, "upload_time": "2010-08-07T14:47:33", "url": "https://files.pythonhosted.org/packages/28/e3/dbdca4763d9a4773a6a82ea8cd85222c9bab88d19b5e6e41c283365fa24a/django-cache-utils-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "e1d2cd98c3c4b4a99ce9ddda51c4fc90", "sha256": "916f233de1d547c95d7cb6175eb9ba9492cebfab57a7b773c69c46c425eb2e0c" }, "downloads": -1, "filename": "django-cache-utils-0.5.1.tar.gz", "has_sig": false, "md5_digest": "e1d2cd98c3c4b4a99ce9ddda51c4fc90", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5520, "upload_time": "2010-09-03T02:21:18", "url": "https://files.pythonhosted.org/packages/e1/dc/7f8bae2ff23461041b431a5f67871d779112ac848cfe8560b395e6751b25/django-cache-utils-0.5.1.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "caf4313b8a65316cbf8be97362ffd1b3", "sha256": "5d4646a86545202311dd22561d46efbddc4404dfffde5324528d92832352d50a" }, "downloads": -1, "filename": "django-cache-utils-0.6.1.tar.gz", "has_sig": false, "md5_digest": "caf4313b8a65316cbf8be97362ffd1b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6672, "upload_time": "2010-09-12T07:57:54", "url": "https://files.pythonhosted.org/packages/b3/a6/e9c9c9db811638b82539ec6c4ea770947d7f3426309fab7e80a9f12dd369/django-cache-utils-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "9ac0076298f2ea3ec02def7e91394b33", "sha256": "c8a96a496f1fa5ef22596641a4167cd722172e7eb34799ba4c28197790b64c75" }, "downloads": -1, "filename": "django-cache-utils-0.6.2.tar.gz", "has_sig": false, "md5_digest": "9ac0076298f2ea3ec02def7e91394b33", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6728, "upload_time": "2010-09-12T14:52:15", "url": "https://files.pythonhosted.org/packages/3e/da/3d694f6d51254bdf14ca941768f50e80c471aac85ad03e430e230f9578b0/django-cache-utils-0.6.2.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "80cbe7183373621edd3f940cde749898", "sha256": "1a53c6a7cf9b272d7c4d6ae8da28bcb590db942d5e7b58ac8a57a0097af8c62b" }, "downloads": -1, "filename": "django-cache-utils-0.6.3.tar.gz", "has_sig": false, "md5_digest": "80cbe7183373621edd3f940cde749898", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6759, "upload_time": "2010-12-08T08:42:01", "url": "https://files.pythonhosted.org/packages/c0/ce/1c74497dfbd8a85b018b6947e477aba626c9a1e54186fd1e81eec3580223/django-cache-utils-0.6.3.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "29f0a7c340125ba671239c0607478653", "sha256": "919c05312dcf9f113dbfc731cf5ad9ae5537491c02b1821886c30ee8ee290a42" }, "downloads": -1, "filename": "django-cache-utils-0.7.0.tar.gz", "has_sig": false, "md5_digest": "29f0a7c340125ba671239c0607478653", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7051, "upload_time": "2010-12-08T20:57:10", "url": "https://files.pythonhosted.org/packages/25/19/bab1c4d6d0df97e6c7015859d4f7da8184398d6a7a66a0087dd783c51277/django-cache-utils-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "b5b306f92143032cfa863bd0a104271e", "sha256": "49c1aab012682c3f1d72c05848bae137996e7deaedb463bbd94a19bc7f5e4650" }, "downloads": -1, "filename": "django-cache-utils-0.7.1.tar.gz", "has_sig": false, "md5_digest": "b5b306f92143032cfa863bd0a104271e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7044, "upload_time": "2010-12-08T22:17:53", "url": "https://files.pythonhosted.org/packages/2e/ce/c5a22c2ce9e6a8302509200ae19fa6024e6618fff1c2d88a7457bb9cab9c/django-cache-utils-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "7dc91b4f7615611ef87795960c84c2e0", "sha256": "30ebe5bb986bd6716a52ade23e33a29099a0ef005f8c6f568fdd2b8c52ab1b25" }, "downloads": -1, "filename": "django-cache-utils-0.7.2.tar.gz", "has_sig": false, "md5_digest": "7dc91b4f7615611ef87795960c84c2e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7178, "upload_time": "2011-01-07T23:45:57", "url": "https://files.pythonhosted.org/packages/c9/2c/f687106f99864e405b8cbf487b43209de82ecf93de6672f1018baaebe1fc/django-cache-utils-0.7.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7dc91b4f7615611ef87795960c84c2e0", "sha256": "30ebe5bb986bd6716a52ade23e33a29099a0ef005f8c6f568fdd2b8c52ab1b25" }, "downloads": -1, "filename": "django-cache-utils-0.7.2.tar.gz", "has_sig": false, "md5_digest": "7dc91b4f7615611ef87795960c84c2e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7178, "upload_time": "2011-01-07T23:45:57", "url": "https://files.pythonhosted.org/packages/c9/2c/f687106f99864e405b8cbf487b43209de82ecf93de6672f1018baaebe1fc/django-cache-utils-0.7.2.tar.gz" } ] }