Il modo migliore per gestire le variabili dev / test / prod in Python?

3

Sto creando un modulo python al lavoro, e ho un file di configurazione con variabili che cambiano per dev o prod (cioè i bucket S3). Qual'è il miglior modo per farlo? In questo momento ho dict in config con le opzioni DEV o PROD, ma selezionarlo ogni volta nelle classi sembra noioso (ad esempio S3_BUCKET [DEV] ecc.).

    
posta user3730954 23.02.2017 - 05:33
fonte

2 risposte

1

Dai tuoi commenti risulta che una parte della tua situazione è che hai proprietà coerenti tramite dev e prod che non vuoi duplicare. Un modo per risolverlo è avere lo stage (dev o prod) come parte delle tue chiavi e usare i caratteri jolly per avere le chiavi uguali. Ad esempio

dev.s3bucket = "dev-bucket";
prod.s3bucket = "prod-bucket";
*.csvfile = "report.csv";

(Puoi regolare questo approccio per diversi formati di configurazione). Dovresti quindi scrivere un semplice gestore di configurazione che puoi chiedere "s3bucket" e cerca il valore appropriato per il tuo ambiente.

La cosa bella di questo tipo di approccio è che si adatta facilmente se aggiungi un altro ambiente o se vuoi aggiungere anche un parametro completamente diverso alla tua configurazione, come avere risorse diverse quando sei in regioni diverse.

    
risposta data 23.02.2017 - 07:07
fonte
0

Quando hai bisogno di valori diversi a seconda dell'ambiente, dovresti probabilmente cercare un file di configurazione che contenga le variabili d'ambiente di cui hai bisogno. Il codice che esegui non dovrebbe mai sapere in quale ambiente viene eseguito, perché ciò significherebbe che non puoi testare il tuo codice di produzione (che è una pessima idea).

Questo è un consiglio generale e non particolarmente legato a Python, ma questo è un esempio di come lo si dovrebbe fare in quel linguaggio (non conosco davvero i bucket S3, userò semplicemente i file JSON per scopi di chiarezza) :

Code.py:

import json
with open('mycfg.json') as f:
    env_vars = json.loads(f.read())
do_something(env_vars)

mycfg_dev.json:

{
    "path": "/tmp"
    "ip": "127.0.0.1"
    "login": "root"
    "password": "root"
}

mycfg_prod.json:

{
    "path": "/var/www"
    "ip": "192.168.1.44"
    "login": "myapp"
    "password": "aunriseqvoa"
}

Dovresti eseguire la versione dei due file nel tuo repository (se è privato, altrimenti non eseguire la versione prod, per evitare un problema molto serio e comune problema di sicurezza ) e rinominare semplicemente quello necessario quando si esegue il modulo. Il file cfg potrebbe forse reindirizzare se stesso ad un altro contenitore di dati se ti porta qualche vantaggio su un file normale.

In generale questo è il modo in cui gestisco le variabili di ambiente, ma forse ho capito qualcosa di sbagliato sui tuoi requisiti.

    
risposta data 23.02.2017 - 06:17
fonte

Leggi altre domande sui tag