python - takes - ¿Dónde poner el código de inicio de Django?
mw_instance=middleware(handler) typeerror: object() takes no parameters (5)
Aquí es cómo trabajo alrededor de la señal de inicio faltante para Django: https://github.com/lsaffre/djangosite/blob/master/djangosite/models.py El código que se llama allí es específico para mi proyecto djangosite, pero el El truco para llamarlo escribiendo una aplicación especial (basada en una idea de Ross McFarland) debería funcionar para otros entornos. Luc
Me gustaría tener estas líneas de código ejecutadas en el inicio del servidor (tanto de desarrollo como de producción):
from django.core import management
management.call_command(''syncdb'', interactive=False)
Ponerlo en settings.py
no funciona, ya que requiere que la configuración esté cargada.
Tampoco funciona ponerlos en una vista y acceder a esa vista externamente, ya que hay algunos middleware que usan la base de datos y 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 de MIDDLEWARE_CLASSES
para que ya no se llame. ¿Puedo hacer eso sin demasiado parche de mono?
Escriba middleware que hace esto en __init__
y luego eleva django.core.exceptions.MiddlewareNotUsed
desde __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 agregar una señal de inicio, pero eso no estará disponible pronto (un problema importante, por ejemplo, es cuando se debe enviar esta señal)
Boleto relacionado: https://code.djangoproject.com/ticket/13024
Actualización: Django 1.7 incluye soporte para esto. ( Documentation , según lo vinculado por el boleto)
Puede crear un comando personalizado y escribir su código en la función de manejo. detalles aquí https://docs.djangoproject.com/en/dev/howto/custom-management-commands/
Luego puede crear un script de inicio que ejecute el servidor django y luego ejecute su nuevo comando personalizado.
Si está utilizando mod_wsgi puede ponerlo en la aplicación de inicio wsgi
Si usaba Apache / mod_wsgi para ambos, use el archivo de script WSGI que se describe en:
http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html
Agregue lo que necesita después de que las traducciones de idiomas estén activadas.
Así:
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()