A simple lock extension for django's cache to prevent concurrent editing.
Install django-cache-lock by using pip
pip install django-cache-lock
You can work with django-cache-lock by using with-statement or decorator.
from django_lock import lock
with lock("global"):
pass
@lock("global")
def foo():
pass
A shortcut to lock model instance
from django.db import models
from django_lock import model_lock
class Foo(models.Model):
bar = models.CharField(max_length=8)
@lock_model
def lock_pk(self):
pass
@lock_model("bar", blocking=False)
def lock_bar(self):
pass
def nolock(self):
pass
foo = Foo()
with lock_model(foo, blocking=False):
nolock()
key | default | desc |
---|---|---|
DJANGOLOCK_PREFIX | "lock:" | lock's key prefix stored in cache |
DJANGOLOCK_SLEEP | 0.1 | default interval time to acquire a lock if a lock is holded by others |
DJANGOLOCK_RELEASEONDEL | True | release lock when __del__ is called if True |
For more usages, please read the code.
- django.core.cache.backends.db
- django.core.cache.backends.file
- django.core.cache.backends.locmem
- django.core.cache.backends.memcached
- django-redis
- django-redis-cache
- DO NOT USE locmem backend in a product environment.
- Memcached does not support milliseconds expire time, and its' expire time is not very exact. So memcached lock's timeout time is not as exact as other backends.
- We didn't test distributed redis lock.
- use memcached's cas to release lock
- reacquire and extend lock
- database backend cache support