63 votes

Comment savoir si mon application Django s'exécute sur un serveur de développement ou non?

Comment puis-je être certain que mon application s'exécute sur un serveur de développement ou non? Je suppose que je pourrais vérifier la valeur de settings.DEBUG et supposer que DEBUG est True alors il fonctionne sur le serveur de développement, mais je préférerais le savoir avec certitude plutôt que de me fier à sur convention.

47voto

Aryeh Leib Taurog Points 867

J'ai mis ce qui suit dans mon settings.py pour faire la distinction entre le serveur de développement standard et fcgi

 import sys
RUNNING_DEVSERVER = (sys.argv[1] == 'runserver')
 

Cependant, cela dépend également de la convention.

22voto

inerte Points 801
server = request.META.get('wsgi.file_wrapper', None)
if server is not None and server.__module__ == 'django.core.servers.basehttp':
    print 'inside dev'

Bien sûr, wsgi.file_wrapper pourrait être mis sur META, et ont une classe à partir d'un module nommé django.core.servers.basehttp par l'extrême hasard sur un autre environnement de serveur, mais j'espère que ce sera vous.

En passant, j'ai découvert cela en faisant une syntatically invalide modèle lors de l'exécution sur le serveur de développement, et la recherche des choses intéressantes sur l' Traceback et de la Request information sections, donc je suis juste éditer ma réponse à corroborer avec Nate idées.

17voto

Soviut Points 26384

En règle générale, je définis une variable appelée environment et la définissez sur "DÉVELOPPEMENT", "STAGING" ou "PRODUCTION". Dans le fichier de paramètres, je peux ensuite ajouter une logique de base pour modifier les paramètres utilisés, en fonction de l'environnement.

EDIT: De plus, vous pouvez simplement utiliser cette logique pour inclure différents fichiers settings.py qui remplacent les paramètres de base. Par exemple:

 if environment == "DEBUG":
    from debugsettings import *
 

7voto

utku_karatas Points 3513

En s'appuyant sur les paramètres.Le DÉBOGAGE est la façon la plus élégante AFAICS comme il est également utilisé dans Django base de code à l'occasion.

Je suppose que ce que vous voulez vraiment est une façon de mettre le drapeau automatiquement sans avoir besoin de vous le mettre à jour manuellement chaque fois que vous téléchargez le projet sur les serveurs de production.

Pour que je vérifie le chemin de settings.py (en settings.py pour déterminer quel serveur le projet est en cours d'exécution sur:

if __file__ == "path to settings.py in my development machine":
    DEBUG = True
elif __file__ in [paths of production servers]:
    DEBUG = False
else:
    raise WhereTheHellIsThisServedException()

Rappelez-vous, vous pouvez aussi préférer faire cette vérification avec les variables d'environnement comme @Soviut suggère. Mais comme quelqu'un développement sur Windows et servir sur Linux vérifier les chemins d'accès aux fichiers est clair, plus facile que de passer par les variables d'environnement.

4voto

Luiz Scheidegger Points 421

Je suis tombé sur ce problème tout à l'heure, et a fini par écrire une solution similaire à Aryeh Leib Taurog de l'. Ma principale différence est que j'ai besoin de faire la différence entre une production et des environnements de dev lors de l'exécution du serveur, mais aussi lors de l'exécution de certains scripts pour mon application (qui, je cours comme DJANGO_SETTINGS_MODULE=paramètres de python [script] ). Dans ce cas, il suffit de regarder si argv[1] == runserver n'est pas suffisant. Donc, ce que j'ai trouvé est de passer un extra argument de ligne de commande, quand je lance le devserver, et aussi quand je lance mes scripts, et il suffit de regarder pour cet argument, dans settings.py. Ainsi, le code ressemble à ceci:

if '--in-development' in sys.argv:
    ## YES! we're in dev
    pass
else:
    ## Nope, this is prod
    pass

ensuite, le serveur devient django

python manage.py runserver [les options que vous voulez] --dans-le développement

et d'exécuter mes scripts est aussi facile que de

DJANGO_SETTINGS_MODULE=paramètres de python [script] --dans-le développement

Assurez-vous simplement que l'argument supplémentaire vous passez le long de doens pas entrer en conflit avec django (en réalité, je utiliser mon le nom de l'application dans le cadre de l'argument). Je pense que c'est assez décent, comme il me permet de contrôler exactement quand mon serveur et les scripts vont se comporter comme des prod ou dev, et je ne suis pas compter sur quelqu'un d'autre conventions, autres que le mien.

EDIT: manage.py se plaint si vous passez non reconnu options, si vous avez besoin de changer le code settings.py pour être quelque chose comme

if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv:
    # ...
    pass

Bien que cela fonctionne, je reconnais que ce n'est pas le plus élégant des solutions...

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