54 votes

Où mettre le code de démarrage de Django?

J'aimerais avoir ces lignes de code exécuté sur le serveur de démarrage (à la fois de développement et de production):

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

Mettant en settings.py ne fonctionne pas, car il exige que les paramètres soient déjà chargé.

Les mettre dans une vue et l'accès à cette vue externe ne fonctionne pas non plus, comme il y a quelques middlewares qui utilisent la base de données et ceux qui vont échouer et de ne pas me laisser accéder à la vue.

Les mettre dans un middleware, mais qui serait appelée à chaque fois que mon application est accessible. Une solution possible pourrait être de créer un middleware qui fait tout le travail, puis se retire MIDDLEWARE_CLASSES il n'est donc pas appelé plus. Puis-je le faire sans trop de singe de correction?

61voto

KillianDS Points 10401

Écrire middleware qui fait cela dans __init__ et ensuite élever django.core.exceptions.MiddlewareNotUsed de la __init__, django va l'enlever pour toutes les demandes :). __init__ est appelé au démarrage par la manière, non pas à la première demande, de sorte qu'il ne bloque pas votre premier utilisateur.

On parle de l'ajout d'un signal de démarrage, mais qui ne sera pas disponible bientôt (un problème majeur pour, par exemple, lorsque ce signal doit être envoyé)

Liées Billet: https://code.djangoproject.com/ticket/13024

Mise à jour: Django 1.7 inclut le support pour cela. (Documentation, comme lié par le billet)

4voto

Graham Dumpleton Points 23711

Si vous utilisiez Apache / mod_wsgi pour les deux, utilisez le fichier de script WSGI décrit dans:

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

Ajoutez ce dont vous avez besoin après l'activation des traductions.

Ainsi:

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

3voto

Muhammad Emam Points 138

Vous pouvez créer une commande personnalisée et écrire votre code dans la fonction handle. détails ici https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

Ensuite, vous pouvez créer un script de démarrage qui exécute le serveur Django, puis exécute votre nouvelle commande personnalisée.

1voto

user61152 Points 231

Si vous utilisez mod_wsgi, vous pouvez le mettre dans l'application de démarrage wsgi

0voto

Luc Saffre Points 21

Voici comment je contourne le signal de démarrage manquant pour Django: https://github.com/lsaffre/djangosite/blob/master/djangosite/models.py Le code appelé ici est spécifique à mon projet djangosite, mais le code astuce pour le faire appeler en écrivant une application spéciale (basée sur une idée de Ross McFarland) devrait fonctionner pour d’autres environnements. Luc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X