私は、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ライブラリを出荷する場合、より良い一般パターンがありますか?