2017-12-28 24 views
0

私は、PyPIを介してPythonライブラリとして配布されるWebサービス用のSDKを持っています。私のライブラリは、典型的なRESTのような要求を使ってバックエンドと通信するためにrequestsを使います。Google App Engineローカル開発サーバーのリクエストを使用する

Google App Engine(GAE)でホストされているアプリケーションと互換性があることを希望します。 the GAE documentation on HTTP requestsによると:

が要求を使用するには、vendoring命令を使用して、両方の要求と リクエスト・ツールベルトをインストールする必要があります。

一度インストール

、URLFetchのを使用する のconfigure要求にrequests_toolbelt.adapters.appengineモジュールを使用します。だから私はそこに与えられた例に従うと、私のライブラリのメインモジュールでこれを持って

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

これは、私のライブラリを使用しているクライアントアプリケーションが実際にApp Engineインスタンス上で実行されているときに役立つと思われます。

ただし、クライアントアプリケーションがdevelopment web server (dev_appserver.py)を使用してローカルで実行されている場合、os.getenv('SERVER_SOFTWARE')"Development/2.0"を返し、したがって、Monkeypatchは実行されません。要求を発行しようとしたとき、私はその後、これらのエラーを取得:

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

は、どのように私は自分のライブラリーのためのホストアプリケーションがGoogle App Engineの自体、開発用ウェブサーバーの内部またはいずれかを実行していることを検出することができますか? 「Development/2.0」を確認することは、それが十分に差別的であるようには思われません。

また、「典型的な」ネットワーク要求をサポートする必要がある共有のPythonライブラリを出荷する場合、より良い一般パターンがありますか?

答えて

1

Google Cloud SDKを掘り下げて見ると、実際にGoogle Apps Engine環境の生産または開発(dev_appserver.py)環境で実行されているかどうかを判断するGoogleの独自の方法は、実際にはSERVER_SOFTWAREのいずれかの値を探しているようです。 〜から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/')) 
関連する問題