2012-06-06 6 views
6

Sto sviluppando un'applicazione utilizzando Flask.Quale strumento Unix per aggiungere/rimuovere rapidamente del testo in uno script Python?

voglio un modo automatizzato rapido per aggiungere e rimuovere debug=True alla funzione di chiamata principale:

Sviluppo:

app.run(debug=True) 

Produzione:

app.run() 

Per motivi di sicurezza, come ho potrebbe esporre informazioni private/sensibili sull'app se lascio la modalità di debug su "in the wild".

Stavo pensando di usare sed o awk per automatizzarlo in un hook git (la versione di produzione è conservata in un repository remoto che spingo a), o includendola in uno script di shell che sto per scrivere per accendere uwsgi e qualche altra "manutenzione" - attività che consentono all'app di essere pubblicata correttamente.

Cosa ne pensi?

risposta

4

Probabilmente should not be using app.run in production (e si sicuramente non ne hai bisogno if you are using uwsgi).Invece, utilizzare una delle numerose opzioni di implementazione discusse nella sezione deployment di eccellente documentazione di Flask. (app.run chiama semplicemente werkzeug.serving.run_simple che esegue Python è incluso wsgiref server.)

Che essendo detto, il modo corretto per fare questo non è con una modifica di post-implementazione per il codice sorgente, ma con un file di configurazione specifiche del server che ti cambia la impostazioni come @brandizzi pointed out in his answer.

È possibile farlo in diversi modi (Flask ha documentation on this too - vedi i suggerimenti di Armin su configuring from files e handling the development-production switch):

  1. includere sia il vostro sviluppo e configurazioni del server nel repository. Utilizzare una variabile di ambiente per passare da uno all'altro:

    # your_app.config.develop 
    DEBUG = True 
    
    # your_app.config.production 
    DEBUG = False 
    
    # your_app.app 
    from flask import Flask 
    from os import environ 
    
    mode = environ.get("YOURAPP_MODE") 
    mode = "production" if mode is None else "develop" 
    
    config = __import__("your_app.config." + mode) 
    
    app = Flask("your_app") 
    app.config.from_object(config) 
    
  2. Conservare la configurazione di produzione in un repository separata insieme ad eventuali altre formazioni specifiche del server potrebbe essere necessario. Carica la configurazione se è impostata una variabile ambientale.

4

userei sed:

sed 's/debug=True//' 

portatile, script, onnipresente.

+0

... e molto fragile. Considerate ciò che accade quando il file viene modificato contiene "= mydebug TrueBlueCanary" –

+0

Sì, proprio adatto solo per un trucco veloce; non per un meccanismo di produzione per la commutazione di ambienti .... –

12

Questa non è la strada da percorrere! La mia raccomandazione è quella di creare un certo modulo di configurazione Python (diciamo, config.py) con alcuni contenuti quali:

DEBUG = True 

Ora, nel nostro codice attuale, scrivere questo:

import config 
app.run(debug=config.DEBUG) 

Ora, quando si eseguire in produzione, basta cambiare DEBUG da True a False. Oppure puoi lasciare questo file non verificato, quindi la copia dello sviluppo è diversa dalla copia della produzione. Questo non è raro dal momento che, ad esempio, non si utilizzano gli stessi parametri di connessione al database sia nello sviluppo che nella produzione.

Anche se si desidera aggiornarlo automaticamente, basta chiamare sed sul file di configurazione con il flag -i. È molto più sicuro aggiornare solo questo file:

$ sed -i.bkp 's/^ *DEBUG *=.*$/DEBUG = False/' config.py 
+0

Grazie per la risposta. Il problema di questa soluzione è che io voglio un modo che è automatizzato e non ho nemmeno bisogno di pensare su- questo modo, posso stare tranquilli che il debug non è attivato in produzione senza dover ricordare di spegnerlo ogni volta Spingo un nuovo commit al repository remoto. Altrimenti, il mio io molto umano potrebbe dimenticare e lasciare la mia app vulnerabile! – ZenLikeThat

+1

@ZenLikeThat Oh, capisco ... ho ampliato la risposta con alcuni suggerimenti - e, dopo tutto, una risposta alla tua domanda esatta :) – brandizzi

+1

Questo è quello che è per ConfigParser. I file di configurazione dovrebbero essere dichiarativi IMO. – sleeplessnerd

5

È necessario impostare alcune variabili di ambiente sul server. Lo script può rilevare la presenza di questa variabile e disabilitare il debug.

+0

Lo farei al contrario :) Metti una variabile sulla macchina dev. Predefinite sicure e tutto. – sleeplessnerd

3

È inoltre possibile utilizzare un gancio NOCOMMIT (da gitty):

Impostare questo come un pre-commit hook

if git diff --cached | grep NOCOMMIT > /dev/null; then 
echo "You tried to commit a line containing NOCOMMIT" 
    exit 1 
fi 
exit 0 

Ciò impedirà il commit se contiene NOCOMMIT.

Naturalmente è possibile sostituire direttamente NOCOMMIT per Debug=True nel gancio.

Problemi correlati