the takes mw_instance incorrect example custom crear python django django-middleware

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)



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()