Use the Django ORM to lock objects in the database
Python

README.rst

Django-locking

Usage

The simplest use is by using it as a context manager:

with NonBlockingLock.objects.acquire_lock(obj=model_obj):
    model_obj.do_something()

Or you can keep track of the lock yourself:

try:
    lock = NonBlockingLock.objects.acquire_lock(obj=model_obj)
except AlreadyLocked:
    return False

model_obj.do_something()
lock.release()

If you have no Django model, or you want to be able to specify the lock name yourself, you can do that too:

# this will raise AlreadyLocked, if it's locked
lock = NonBlockingLock.objects.acquire_lock(lock_name='my_lock')
do_something()
lock.release()

Test

You can run the tests with

tox

Wishlist

  • Add lock time-out (try to aquire a lock for up to a given TIME_OUT), like lockfile's FileLock.aquire
  • Global locks (for instance on a whole Model not just an object)

Releases

v2.0.0:
Merging of master and pre-django-1.8 branches Removes management command in favor of a celery task
v1.2.1:
Fix problem in migration to UUIDField for PostGres
v1.2.0:
Move id to UUIDField, add code quality checks and CI
v1.1.0:
Rename model to NonBlockingLock and add additional features
v1.0.1:
Corrected tests and code clean-up
v1.0.0:
Intial release.