2009-07-05 24 views
6

Tengo la base de datos mysql como motor para django. Django funciona pensado nginx vía fastcgi con timeout en 1 min (después de eso nginx dice "504 gateway time-out").Cómo configurar el tiempo de espera para la conexión de la base de datos en django

Si la base de datos no funciona, django está intentando volver a conectarse a DB y esperando la respuesta de la misma. Y esperando una respuesta demasiado larga (más de 1 minuto), nginx devuelve al cliente el código de error 504.

Cómo configurar el tiempo de espera para db connecton en django? ¿Y cuál es la forma correcta de manejar este evento y devolverle al cliente una página bonita con "La base de datos perdida está ahora fuera de servicio. Inténtelo más tarde" en lugar de la página de error técnica 504?

Respuesta

5

DATABASE_OPTIONS en settings.py es un dict de args de palabras clave adicionales que se pasan al método connect de cualquier módulo de base de datos que esté en uso; por MySqlDB 's documentos en connect, el valor connect_timeout, como dice la otra respuesta, es de hecho lo que quiere allí (lo tuve mal antes, y varía por backend - por ejemplo, se escribe timeout si su back-end es SQLite) .

Para las páginas de error personalizadas, puede seguir los consejos del Django docs sobre cómo escribir su propio middleware de excepción (estoy seguro de que el middleware de excepción simple muestra una página personalizada en el software contribuido, pero puede ser más rápido rodar tu propio que buscar en la web el código existente, y probablemente tendrías que modificar ese código de todos modos ;-).

+0

¿Es esta una opción genérica que funciona con todos los backends de bases de datos de Django compatibles? (Busqué en Google y solo lo encontré mencionado en relación con SQLAlchemy) – lemonad

+0

no, no lo era, mi mal - corregido ahora - tenga en cuenta que no hay una sola manera que funcione con todos los DB, pero connect_timeout funciona con MySql, el tiempo de espera funciona con SQLite, etc. (siempre como claves en DATABASE_OPTIONS en settings.py). –

11

Puede usar el diccionario OPTIONS de su configuración DATABASES.

El nombre de la opción depende de su base de DB, pero para PostgreSQL sería connect_timeout:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.postgresql', 
     … 
     OPTIONS = { 
      'connect_timeout': 5, 
     } 
    } 
} 
+4

'DATABASE_OPTIONS' parece cambiarse a' OPTIONS' ya que Django 1.2 (https://docs.djangoproject.com/en/1.9/releases/1.2/) – SangminKim

+0

'connect_timeout' también parece obsoleto, al menos para Django1.9 . Solo se acepta 'timeout', espero que sea el reemplazo correcto. – zeycus

+0

@zeycus 'connect_timeout' es la opción correcta para Postgres. Errores de psycopg2 2.7.3.2 con "opción de conexión no válida" si se utiliza 'timeout'. Los documentos de Django solo mencionan 'timeout' para los usuarios de Sqlite. – cdignam

Cuestiones relacionadas