2017-12-28 21 views
0

Ich habe ein SDK für meinen Webdienst, der als eine Python-Bibliothek über PyPI verteilt wird. Meine Bibliothek verwendet requests für die Kommunikation mit dem Back-End mithilfe von typischen REST-ähnlichen Anforderungen.Anfragen in Google App Engine lokalen Entwicklungsserver verwenden

würde ich meine Bibliothek sein kompatibel mit Anwendungen, wie die auf Google App Engine (GAE) gehostet werden. Nach the GAE documentation on HTTP requests:

Anfragen zu nutzen, werden Sie beiden Anfragen und Anfragen-toolbelt mit den vendoring Anweisungen zu installieren.

Einmal installiert, verwenden Sie das requests_toolbelt.adapters.appengine Modul configure Anfragen URLFetch zu verwenden:

So folge ich dem Beispiel dort gegeben und haben dies in Hauptmodul meiner Bibliothek:

if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'): 
     import requests_toolbelt.adapters.appengine 
     requests_toolbelt.adapters.appengine.monkeypatch() 

Dies scheint der Trick zu sein, wenn eine Clientanwendung, die meine Bibliothek verwendet, tatsächlich auf einer App Engine-Instanz ausgeführt wird.

Wenn jedoch die Clientanwendung lokal unter Verwendung von development web server (dev_appserver.py) ausgeführt wird, gibt "Development/2.0" zurück und der Monkeypatch wird nicht ausgeführt. Ich erhalte anschließend diese Fehler bei dem Versuch, Anfragen zu stellen:

ConnectionError: ('Connection aborted.', error(13, 'Permission denied')) 

Wie kann ich erkennen, dass die Host-Anwendung für meine Bibliothek läuft entweder in Google App Engine selbst, oder in der Entwicklung Web-Server? Die Überprüfung auf "Entwicklung/2.0" scheint nicht genug diskriminierend zu sein.

Oder gibt es ein besseres allgemeines Schema beim Versand einer freigegebenen Python-Bibliothek, die Unterstützung für "typische" Netzwerkanforderungen benötigt?

Antwort

1

Beim Durchsuchen des Google Cloud SDK scheint es so zu sein, dass Googles eigene Methode zur Bestimmung, ob wir in der Google App Engine-Umgebung für Produktion oder Entwicklung arbeiten, nach diesen Werten für SERVER_SOFTWARE sucht. Von apitools/base/py/util.py

def DetectGae(): 
    """Determine whether or not we're running on GAE. 

    This is based on: 
     https://developers.google.com/appengine/docs/python/#The_Environment 

    Returns: 
     True iff we're running on GAE. 
    """ 
    server_software = os.environ.get('SERVER_SOFTWARE', '') 
    return (server_software.startswith('Development/') or 
      server_software.startswith('Google App Engine/')) 
Verwandte Themen