En Python, Comment puis-je tester si je suis dans Google App Engine SDK?
en cours de développement, je veux gérer certaines choses légèrement différemment que lorsque je finirai par télécharger sur les serveurs Google.
y a-t-il un test rapide que je peux faire pour savoir si je suis dans le SDK ou en vie?
4 réponses
voir: https://cloud.google.com/appengine/docs/python/how-requests-are-handled#Python_The_environment
les variables d'environnement suivantes font partie de la norme CGI, avec un comportement particulier dans App Engine:
SERVER_SOFTWARE
:Dans le serveur web de développement, cette valeur est de "
Development/X.Y
" où "X.Y
" est la version de l'exécution.Lors de l'exécution sur App Engine, cette valeur est "
Google App Engine/X.Y.Z
".
Basé sur le même truc, j'utilise cette fonction dans mon code:
def isLocal():
return os.environ["SERVER_NAME"] in ("localhost", "www.lexample.com")
j'ai personnalisé mon /etc/hosts
fichier pour pouvoir accéder à la version locale en préparant un "l" à mon nom de domaine, il est donc très facile de passer du local à la production.
Exemple:
- l'url de production est
www.example.com
- l'url de développement est
www.lexample.com
je viens de vérifier le httplib (qui est un wrapper autour de appengine fetch)
def _is_gae():
import httplib
return 'appengine' in str(httplib.HTTP)
une solution plus générale
Une solution plus générale, qui n'implique pas D'être sur un serveur Google, détecte si le code est en cours d'exécution sur votre machine locale.
Je suis à l'aide du code ci-dessous quel que soit le serveur d'hébergement:
import socket
if socket.gethostname() == "your local computer name":
DEBUG = True
ALLOWED_HOSTS = ["127.0.0.1", "localhost", ]
...
else:
DEBUG = False
ALLOWED_HOSTS = [".your_site.com",]
...
si vous utilisez macOS vous pouvez écrire un code plus générique:
if socket.gethostname().endswith(".local"): # True in your local computer
...
les développeurs Django doivent mettre cet exemple de code dans le fichier settings.py
du projet.
EDIT:
Selon Jeff O'Neill in macOS High Sierra socket.gethostname()
renvoie une chaîne se terminant par ".LAN."