Comment savoir si mon application Django tourne sur un serveur de développement ou non?
Comment puis-je être certain que mon application tourne sur un serveur de développement ou pas? Je suppose que je pourrais vérifier la valeur de settings.DEBUG
et supposer que DEBUG
est True
alors il est en cours d'exécution sur le serveur de développement, mais je préfère savoir pour sûr que de compter sur la convention.
12 réponses
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 défini sur META, et avoir une classe à partir d'un module nommé django.core.servers.basehttp
par coïncidence extrême sur un autre environnement serveur, mais j'espère que cela vous aura couvert.
soit dit en passant, j'ai découvert ceci en faisant un modèle syntatiquement invalide pendant l'exécution sur le serveur de développement, et j'ai cherché des choses intéressantes sur les sections Traceback
et Request information
, donc je suis en train d'éditer ma réponse pour corroborer avec Les idées de Nate.
j'ai mis ce qui suit dans mon settings.py pour distinguer entre le serveur de développement standard et la production:
import sys
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
Cela repose également sur la convention, cependant.
(modifié par le commentaire de Daniel Magnusson)
typiquement, je mets une variable appelée environment
et la place dans "développement", "mise en scène" ou "PRODUCTION". Dans le fichier settings, je peux ensuite ajouter basic logic pour modifier les paramètres utilisés, basés sur l'environnement.
EDIT: de plus, vous pouvez simplement utiliser cette logique pour inclure différents fichiers settings.py
qui outrepassent les paramètres de base. Par exemple:
if environment == "DEBUG":
from debugsettings import *
en se basant sur les paramètres.DEBUG est le moyen le plus élégant AFAICS car il est également utilisé dans la base de code Django à l'occasion.
je suppose que ce que vous voulez vraiment est un moyen de mettre ce drapeau automatiquement sans avoir besoin de le mettre à jour manuellement chaque fois que vous téléchargez le projet sur des serveurs de production.
pour que je vérifie le chemin de settings.py (en settings.py) pour déterminer sur quel serveur le projet s'exécute:
if __file__ == "path to settings.py in my development machine":
DEBUG = True
elif __file__ in [paths of production servers]:
DEBUG = False
else:
raise WhereTheHellIsThisServedException()
Attention, vous pourriez aussi préférer faire cette vérification avec les variables d'environnement comme @Soviut le suggère. Mais comme quelqu'un se développe sur Windows et sert sur Linux vérifier les chemins de fichier était tout simplement plus facile que d'aller avec des variables d'environnement.
cela fonctionne habituellement:
import sys
if 'runserver' in sys.argv:
# you use runserver
j'ai rencontré ce problème tout à l'heure, et j'ai fini par écrire une solution similaire à celle d'Aryeh Leib Taurog. Ma principale différence est que je veux faire la différence entre un environnement de production et un environnement dev lors de l'exécution du serveur, mais aussi lors de l'exécution de scripts uniques pour mon application (que j'exécute comme DJANGO_SETTINGS_MODULE=paramètres python [le script] ). Dans ce cas, simplement regarder si argv[1] == runserver n'est pas suffisant. Donc, ce que j'ai trouvé est de passer un supplément de ligne de commande argument quand j'exécute le devserver, et aussi quand j'exécute mes scripts, et cherchez juste cet argument dans settings.py. Le code ressemble donc à ceci:
if '--in-development' in sys.argv:
## YES! we're in dev
pass
else:
## Nope, this is prod
pass
alors, exécuter le serveur django devient
python manage.py runserver [quelles que soient les options que vous voulez] --in-development
et exécuter mes scripts est aussi facile que
DJANGO_SETTINGS_MODULE=paramètres de python [script] --dans-développement
assurez-vous juste que l'argument supplémentaire que vous transmettez n'entre pas en conflit avec quoi que ce soit django (en réalité j'utilise le nom de mon application dans le cadre de l'argument). Je pense que c'est assez décent, car cela me permet de contrôler exactement quand mon serveur et mes scripts se comporteront comme prod ou dev, et je ne compte pas sur les conventions de quelqu'un d'autre, autre que le mien.
modifier: manage.py se plaint si vous passez des options non reconnues, donc vous devez changer le code dans settings.py ê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 la solution la plus élégante...
si vous voulez changer vos fichiers de paramètres automatiquement dépendant de l'environnement runtime vous pouvez simplement utiliser quelque chose qui diffère dans environ, par exemple
from os import environ
if environ.get('_', ''):
print "This is dev - not Apache mod_wsgi"
paramètres.Le débogage peut être True et s'exécuter sous Apache ou un autre serveur autre que de développement. Il sera toujours exécuté. Pour autant que je puisse dire, il n'y a rien dans l'environnement d'exécution à part l'examen des pid et la comparaison avec les pid dans L'OS qui vous donnera cette information.
une différence entre l'environnement de développement et de déploiement sera le serveur sur lequel il tourne. Ce qui est exactement différent dépendra de vos environnements de développement et de déploiement.
connaissant vos propres environnements dev et deploy, les variables de requêtes HTTP peuvent être utilisées pour distinguer les deux. Regardez variables comme request.META.HTTP_HOST
, request.META.SERVER_NAME
et request.META.SERVER_PORT
et de les comparer dans les deux environnements.
je parie que vous trouverez quelque chose de tout à fait évident qui est différent et peut être utilisé pour détecter votre environnement de développement. Faites le test dans settings.py
et définissez une variable que vous pouvez utiliser ailleurs.
j'utilise:
DEV_SERVERS = [
'mymachine.local',
]
DEVELOPMENT = platform.node() in DEV_SERVERS
qui nécessite de faire attention à ce qui est retourné par .node()
sur vos machines. Il est important que la valeur par défaut soit non-développement afin que vous n'exposiez pas accidentellement des informations sensibles de développement.
vous pouvez également regarder dans des moyens plus compliqués d'identifier uniquement les ordinateurs .
inspiré par la réponse D'Aryeh, le truc que j'ai conçu pour mon propre usage est de chercher le nom de mon script de gestion dans sys.argv[0]
:
USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]
(mon cas d'utilisation est d'activer automatiquement L'authentification Native Django lors de l'exécution du serveur de test - lors de l'exécution sous Apache, même sur les serveurs de développement, toute authentification pour mon projet actuel est gérée via Kerberos)
vous pouvez déterminer si vous êtes sous WSGI
(mod_wsgi, gunicorn, serveuse, etc.) et de manage.py
(runserver, de test, de migrer, etc.) ou n'importe quoi d'autre:
import sys
WSGI = 'django.core.wsgi' in sys.modules