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.

47
demandé sur Imran 2009-08-18 08:10:26

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.

20
répondu inerte 2016-09-13 17:02:09

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)

32
répondu Aryeh Leib Taurog 2015-01-07 07:15:26

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 *
13
répondu Soviut 2016-11-06 18:03:20

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.

6
répondu utku_karatas 2009-08-18 05:44:47

cela fonctionne habituellement:

import sys

if 'runserver' in sys.argv:
    # you use runserver
6
répondu Sven R. Kunze 2016-06-17 11:52:44

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...

4
répondu Luiz Scheidegger 2012-01-17 20:11:01

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"         
3
répondu Ed C 2012-10-03 12:14:49

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.

2
répondu hughdbrown 2009-08-18 04:14:19

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.

2
répondu Nate 2009-08-18 04:32:07

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 .

2
répondu Carl G 2012-06-27 17:53:33

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)

1
répondu ncoghlan 2012-05-24 06:28:47

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
1
répondu OrangeDog 2018-02-02 13:57:20