2010-05-06 15 views
46

me gustaría tener estas líneas de código que se ejecuta en el arranque del servidor (tanto en el desarrollo y producción):¿Dónde poner el código de inicio de Django?

from django.core import management 
management.call_command('syncdb', interactive=False) 

Ponerlo en settings.py no funciona, ya que requiere la configuración para ser cargado ya.

Ponerlos en una vista y acceder a esa vista externamente tampoco funciona, ya que hay algunos middlewares que usan la base de datos y estos fallarán y no me permitirán acceder a la vista.

Ponerlos en un middleware funcionaría, pero se llamaría cada vez que se accede a mi aplicación. Una posible solución podría ser crear un middleware que haga todo el trabajo y luego se elimine del MIDDLEWARE_CLASSES para que ya no se llame. ¿Puedo hacer eso sin demasiado parche de mono?

Respuesta

53

Escribir middleware que hace esto en __init__ y luego aumentar django.core.exceptions.MiddlewareNotUsed desde el __init__, django lo eliminará para todas las solicitudes :). __init__ se llama al inicio, por cierto, no en la primera solicitud, por lo que no bloqueará a su primer usuario.

Se habla de la adición de una señal de puesta en marcha, pero que no estará disponible en breve (un problema importante, por ejemplo, es cuando esta señal debe ser enviada)

entradas relacionadas: https://code.djangoproject.com/ticket/13024

Actualización: Django 1.7 incluye soporte para esto. (Documentation, como un vínculo del billete)

+0

Gracias por la respuesta rápida. Esto es exactamente lo que necesito. –

+4

Es un buen truco del que no tenía conocimiento. –

+2

Según http://stackoverflow.com/questions/6791911/execute-code-when-django-starts-once-only, esto puede ser problemático. Aquí se sugiere poner la función de inicio en urls.py – Michael

1

Si está utilizando mod_wsgi se puede poner en la aplicación de inicio wsgi

4

Si estaba utilizando Apache/mod_wsgi tanto, utilice el archivo de script WSGI se describe en:

http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

agregar lo que necesita después de traducciones a otros idiomas se activan.

Por lo tanto:

import sys 

sys.path.insert(0, '/usr/local/django/mysite') 

import settings 

import django.core.management 
django.core.management.setup_environ(settings) 
utility = django.core.management.ManagementUtility() 
command = utility.fetch_command('runserver') 

command.validate() 

import django.conf 
import django.utils 

django.utils.translation.activate(django.conf.settings.LANGUAGE_CODE) 

# Your line here. 
django.core.management.call_command('syncdb', interactive=False) 

import django.core.handlers.wsgi 

application = django.core.handlers.wsgi.WSGIHandler() 
+0

Eso se vería un poco diferente ya que uso twod.wsgi. Además, me gustaría hacer esto en el servidor de desarrollo también. Y no iría tan bajo como Apache. La idea es que quizás no quiera darle acceso al servidor al desarrollador de la aplicación, pero déjelo usar el administrador de django al ponerlo en su código de inicio. –

3

Se puede crear un comando personalizado y escribir el código en la función de asa. detalles aquí https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

A continuación, puede crear un script de inicio que ejecute el servidor django y luego ejecute su nuevo comando personalizado.

+1

Esta es una mala elección ya que se basa en una secuencia de comandos envoltorio alrededor del inicio del servidor. ¿Qué sucede si alguien olvida iniciar el servidor sin el script? – KillianDS

+0

Estoy de acuerdo con @ [KillianDS] (http://stackoverflow.com/users/243870/killiands). Aún así, es una posibilidad. Pero entonces tendría que usar su contenedor como punto de entrada al servidor, que puede ser cualquier plataforma, mod_wsgi, motor de aplicación, tornado, etc. –

0

Aquí es cómo trabajo alrededor de la señal de inicio de falta de Django: https://github.com/lsaffre/djangosite/blob/master/djangosite/models.py El código que se está llamando no es específico de mi proyecto djangosite, pero el truco para lograr que se llama escribiendo una aplicación especial (basado en una idea de Ross McFarland) debería funcionar para otros entornos. Luc

Cuestiones relacionadas