2017-06-02 2 views
2

J'ai un site Django avec 3 environnements (Local, Staging, Production).Répliquer une partie de la base de données de production django en local ou en mise en scène

La production contient des données auxquelles je ne veux pas que mes développeurs aient accès (Données personnelles et données financières des utilisateurs).

L'exécution d'une restauration de sauvegarde de base de données n'est pas une option pour des raisons de conformité.

Cependant, nous avons également des pages de contenu sur ce site Web que nous gérons avec Wagtail CMS.

Je suis à la recherche d'un moyen de synchroniser les données de production (seulement certains modèles, mais spécifiquement les pages wagtail) avec l'environnement local de Staging and Developers quand ils en ont besoin.

Idéalement je voudrais avoir une gestion commande que je peux courir dans un autre environnement pour copier des données:

Exemple: ./manage.py sync_from_prod BlogPost ce trouverait tout de blog manquant dans l'environnement local ou la mise en scène et pourrait les créer dans la base de données. Je ne trouve aucune bibliothèque qui fasse ça pour Wagtail ou Django.

Cela semble être un problème commun et je suis surpris de ne trouver aucune question Stackoverflow ou librairies opensource résolvant ce problème.

Si rien n'existe, je vais probablement essayer d'écrire mon propre django-modèle de synchronisation (Trouvé ce projet, mais il est vieux et compatible trois années jusqu'à django 1.7 et je suis sur python3 django 1.11)

Pour gérer la sécurité, un secret pourrait être utilisé par un dev pour accéder à une API de production exposant les données (over ssl) par exemple

Répondre

0

Potentiellement vous pouvez utiliser la commande dumpdata (ou étendre la commande) dans prod pour obtenir l'export JSON des données du blog, puis utilisez la commande loaddata localement pour enregistrer dans votre environnement local.

Comment mettre en œuvre le flux de travail est entièrement à vous, par exemple. Vous pouvez envelopper la commande dumpdata dans une API protégée sur prod, puis créer/exécuter une commande sync_from_prod dans votre environnement local pour appeler cette API et exécuter la commande call_command('loaddata', 'data_file.json') avec les données exportées JSON de prod.

CODE PSEUDO:

# the api view to provide the data on prod 
def dumpdata_view(requst): 
    output = StringIO.StringIO() 
    call_command('dumpdata', output=output) 
    output.seek(0) 
    return JsonResponse(output.readlines() 

# command to execute locally 
class sync_from_prod(BaseCommand): 
    def handle(self, *args, **kwargs): 
     with open('data_file.json', 'w') as f: 
      data = requests.get('https://prod/api/dumpdata?model=BlogPost') 
      f.write(data.content) 
     call_command('loaddata', 'data_file.json') 
+0

Le problème avec les données de vidage est que vous avez aucun contrôle sur les données que vous obtenez (pas de filtre, pas de crochets pour transformer les points de données personnelles d'identification). – Benos

+0

J'étais dans le contexte que vous voulez synchroniser le BlogPost de prod seulement. La partie de données obfuscating est un problème distinct. –