2017-12-28 45 views
0

PyPI를 통해 Python 라이브러리로 배포되는 웹 서비스 용 SDK가 있습니다. 내 라이브러리는 일반적인 REST와 유사한 요청을 사용하여 백엔드와 통신하기 위해 requests을 사용합니다.Google App Engine 로컬 개발 서버에서 요청 사용

내 라이브러리가 Google App Engine (GAE)에서 호스팅되는 응용 프로그램과 호환되기를 바랍니다. the GAE documentation on HTTP requests에 따르면

요청을 사용하려면 vendoring 지침을 사용하여 두 요청과 요청 - 툴 벨트를 설치해야합니다.

그래서 내가 거기에 주어진 예를 따라 내 도서관의 주요 모듈이 있습니다 :

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

일단 설치는 URL을 가져올 수를 사용하는 구성 요청에 requests_toolbelt.adapters.appengine 모듈을 사용

내 라이브러리를 사용하는 클라이언트 응용 프로그램이 실제로 App Engine 인스턴스에서 실행되고있는 경우에이 트릭을 수행하는 것으로 보입니다.

그러나 클라이언트 응용 프로그램이 development web server (dev_appserver.py)을 사용하여 로컬로 실행되는 경우 os.getenv('SERVER_SOFTWARE')"Development/2.0"을 반환하므로 monkeypatch가 실행되지 않습니다. 요청을 발행 할 때 나는 이후 이러한 오류를 얻을 :

내 라이브러리에 대한 호스트 응용 프로그램이 개발 웹 서버 내부에 구글 앱 엔진 자체 또는중 하나 실행되고 있는지 감지 할 수있는 방법
ConnectionError: ('Connection aborted.', error(13, 'Permission denied')) 

? "Development/2.0"을 확인하는 것은 충분히 차별적 인 것처럼 보이지 않습니다.

또는 "일반적인"네트워크 요청에 대한 지원이 필요한 공유 파이썬 라이브러리를 출하 할 때 따라야 할 일반적인 패턴이 있습니까?

답변

1

Google Cloud SDK를 파헤 치다가 Google App 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/'))