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.
Réponses
Trop de publicités?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.
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 *
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.
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...