Anonymize production data so it can be safely used in not-so-safe environments
Project description
django-anon will help you anonymize your production database so it can be shared among developers, helping to reproduce bugs and make performance improvements in a production-like environment.
Features
🚀 |
Really fast data anonymization and database operations using bulk updates to operate over huge tables |
🍰 |
Flexible to use your own anonymization functions or external libraries like Faker |
🐩 |
Elegant solution following consolidated patterns from projects like Django and Factory Boy |
🔨 |
Powerful. It can be used on any projects, not only Django, not only Python. Really! |
Table of Contents
Installation
pip install django-anon
Supported versions
Python (2.7, 3.7)
Django (1.8, 1.11, 2.2, 3.0)
License
Usage
Use anon.BaseAnonymizer to define your anonymizer classes:
import anon
from your_app.models import Person
class PersonAnonymizer(anon.BaseAnonymizer):
email = anon.fake_email
# You can use static values instead of callables
is_admin = False
class Meta:
model = Person
# run anonymizer: be cautious, this will affect your current database!
PersonAnonymizer().run()
Built-in functions
import anon
anon.fake_word(min_size=_min_word_size, max_size=20)
anon.fake_text(max_size=255, max_diff_allowed=5, separator=' ')
anon.fake_small_text(max_size=50)
anon.fake_name(max_size=15)
anon.fake_username(max_size=10, separator='')
anon.fake_email(max_size=25, suffix='@example.com')
anon.fake_url(max_size=50, scheme='http://', suffix='.com')
anon.fake_phone_number(format='999-999-9999')
Lazy attributes
Lazy attributes can be defined as inline lambdas or methods, as shown below, using the anon.lazy_attribute function/decorator.
import anon
from your_app.models import Person
class PersonAnonymizer(anon.BaseAnonymizer):
name = anon.lazy_attribute(lambda o: 'x' * len(o.name))
@lazy_attribute
def date_of_birth(self):
# keep year and month
return self.date_of_birth.replace(day=1)
class Meta:
model = Person
The clean method
import anon
class UserAnonymizer(anon.BaseAnonymizer):
class Meta:
model = User
def clean(self, obj):
obj.set_password('test')
obj.save()
Defining a custom QuerySet
A custom QuerySet can be used to select the rows that should be anonymized:
import anon
from your_app.models import Person
class PersonAnonymizer(anon.BaseAnonymizer):
email = anon.fake_email
class Meta:
model = Person
def get_queryset(self):
# keep admins unmodified
return Person.objects.exclude(is_admin=True)
High-quality fake data
In order to be really fast, django-anon uses it’s own algorithm to generate fake data. It is really fast, but the generated data is not pretty. If you need something prettier in terms of data, we suggest using Faker, which can be used out-of-the-box as the below:
import anon
from faker import Faker
from your_app.models import Address
faker = Faker()
class PersonAnonymizer(anon.BaseAnonymizer):
postalcode = faker.postalcode
class Meta:
model = Address
Changelog
Check out CHANGELOG.rst for release notes
Contributing
Check out CONTRIBUTING.rst for information about getting involved
Icon made by Eucalyp from www.flaticon.com
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for django_anon-0.3-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9068f52de39bcc48d39d4a37d03493c3e3b17467921eca2409ec061ab151b83a |
|
MD5 | 2aa576957fb56af0f29bc04287786c89 |
|
BLAKE2b-256 | 630803612fdd4bbc036d1219f52bfd5e39178dce2021811de69f933a7cd476c5 |