2012-06-06 6 views
6

Estoy desarrollando una aplicación usando Flask.¿Qué herramienta de Unix para agregar/eliminar rápidamente texto a un script de Python?

quiero una manera rápida y automatizada para agregar y quitar debug=True a la principal función de llamada:

Desarrollo:

app.run(debug=True) 

Producción:

app.run() 

Por razones de seguridad, como lo podría exponer información privada/confidencial sobre la aplicación si dejo el modo de depuración en "en la naturaleza".

Estaba pensando en usar sed o awk para automatizar esto en un git hook (la versión de producción se guarda en un repositorio remoto simple al que presiono), o incluirlo en un script de shell que voy a escribir para iniciar uwsgi y algunas otras tareas de "mantenimiento" que permiten que la aplicación se sirva correctamente.

¿Qué opinas?

Respuesta

4

Probablemente should not be using app.run in production (y usted definitivamente no lo necesita if you are using uwsgi).En su lugar, use una de las varias opciones de implementación que se tratan en la sección deployment de la excelente documentación de de Flask. (app.run llamadas con sólo werkzeug.serving.run_simple que ejecuta Python que está incluido wsgiref servidor.)

Dicho esto, la forma correcta de hacer esto no es con un poste de implementar edición en su código fuente, pero con un archivo de configuración específica del servidor que cambia su configuración como @brandizzi pointed out in his answer.

Usted puede hacer esto de varias maneras diferentes (Frasco tiene documentation on this too - ver las sugerencias de Armin en configuring from files y handling the development-production switch):

  1. incluyen tanto su desarrollo y configuraciones de su servidor en su repositorio. Utilice una variable ambiental para cambiar entre ellos:

    # 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. tienda la configuración de producción en un repositorio separado junto con las otras configuraciones específicas del servidor que pueda necesitar. Cargue la configuración si se establece una variable de entorno.

4

que haría uso de sed:

sed 's/debug=True//' 

portátil, secuencias de comandos, omnipresente.

+0

... y muy frágil. Considere lo que sucede cuando el archivo que se está modificando contiene "mydebug = TrueBlueCanary" –

+0

Sí, solo es adecuado para un hack rápido; no para un mecanismo de producción para alternar entornos .... –

12

¡Ese no es el camino a seguir! Mi recomendación es crear algún módulo Python configuración (digamos, config.py) con un cierto contenido, tales como:

DEBUG = True 

Ahora, en nuestro código actual, escribir lo siguiente:

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

Ahora, cuando ejecutar en producción, simplemente cambie DEBUG de True a False. O puede dejar este archivo sin versión, por lo que la copia del desarrollo es diferente de la copia de producción. Esto no es raro ya que, por ejemplo, uno no usa los mismos parámetros de conexión de base de datos tanto en desarrollo como en producción.

Incluso si desea actualizarlo automáticamente, simplemente invoque sed en el archivo de configuración con el indicador -i. Es mucho más seguro actualizar solo este archivo:

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

Gracias por responder. El problema con esta solución es que quiero una forma que sea automática y ni siquiera tenga que pensar. De esa manera, puedo estar tranquilo de que la depuración no se enciende durante la producción sin tener que acordarme de apagarla cada vez. Empujo un nuevo compromiso al repositorio remoto. De lo contrario, mi yo muy humano podría olvidar y dejar mi aplicación vulnerable. – ZenLikeThat

+1

@ZenLikeThat Ah, ya veo ... Amplié la respuesta con algunas sugerencias y, después de todo, una respuesta a su pregunta exacta :) – brandizzi

+1

Para eso es ConfigParser. Los archivos de configuración deben ser declarativos IMO. – sleeplessnerd

5

Debe configurar alguna variable de entorno en el servidor. Su secuencia de comandos puede detectar la presencia de esta variable y desactivar la depuración.

+0

Lo haría al revés :) Coloque una variable en la máquina de desarrollo. Valores predeterminados seguros y todo. – sleeplessnerd

3

También puede utilizar un gancho NOCOMMIT (de gitty):

Conjunto esto como un gancho pre-commit

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

Esto evitará que el commit si contiene NOCOMMIT.

Puede, por supuesto, reemplazar directamente NOCOMMIT por Debug=True en el gancho.

Cuestiones relacionadas