web-dev-qa-db-ja.com

PythonリクエストライブラリをGoogle App Engineで使用できますか?

Google App Engineで Requests を使用できますか?このライブラリは、RESTクライアントを作成するのに最適だと思います。

32

はい。 Google Appengine(バージョン1.9.18)では requestsバージョン2.3.0は本番環境で動作します(SDKでは動作しません) )課金を有効にしている場合は、ソケットのサポートが有効になります。

更新:2017年1月31日の時点で、リクエストはバージョン2.9.1の本番環境で機能しています。ただし、Google Cloud SDK141.0.0では機能しません

appengine SDKでのリクエストは、すべてのhttps://リクエストで失敗します。

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

リクエストバージョン2.4.1は、次の場合に本番環境で失敗します。

  File "distlib/requests/adapters.py", line 407, in send
    raise ConnectionError(err, request=request)
  ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

バージョン2.5.1が本番環境で失敗すると、次のように要求されます。

  File "distlib/requests/adapters.py", line 415, in send
    raise ConnectionError(err, request=request)
  ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

リクエストバージョン2.3.0は本番環境で機能しますが、DebianがSDKでSSLv3サポートを削除すると問題が発生する可能性があります(リクエスト2.3.0には独自の古いurllib3が付属しています)。回避策として、リクエストのurllib3コピーのソースにあるPROTOCOL_SSLv3を含む行を削除することができます。

  'module' object has no attribute 'PROTOCOL_SSLv3'

ソケットサポートに関する情報: https://cloud.google.com/appengine/docs/python/sockets/

27
cat

requests-toolbeltライブラリをインストールします: https://github.com/sigmavirus24/requests-toolbelt

App Engineの場合、次のようになります:pip install requests-toolbelt -t lib

(参照: https://cloud.google.com/appengine/docs/python/tools/using-libraries-python-27#installing_a_library

それから加えて:

from requests_toolbelt.adapters import appengine
appengine.monkeypatch()

main.pyまたは同等のもの。

Edit:このソリューションは公式ドキュメントの一部になりました: https://cloud.google.com/appengine/docs/python/ issue-requests#issuing_an_http_requestREQUESTSタブ内)

41
Eyal Levin

これが可能になりました。appengine_config.pyの次の回避策の組み合わせを使用して機能させました。

# Step 1: first add requests and requests-toolbelt to your requirements.txt (or however you install them via pip)
# Step 2: in appengine_config.py add the following snippet:

# see https://cloud.google.com/appengine/docs/python/issue-requests#issuing_an_http_request
import requests
import requests_toolbelt.adapters.appengine

# Use the App Engine Requests adapter. This makes sure that Requests uses
# URLFetch.
requests_toolbelt.adapters.appengine.monkeypatch()

# also monkey patch platform.platform() from https://code.google.com/p/googleappengine/issues/detail?id=12982
import platform

def patch(module):
    def decorate(func):
        setattr(module, func.func_name, func)
        return func
    return decorate


@patch(platform)
def platform():
    return 'AppEngine'
8
jcjones1515

まだですが、うまくいけばすぐに。 GAEのサポートは現在作業中です-問題 #498 を参照してください(App Engineの修正)。

リクエストは rllib を使用し、次に httplib を使用します is GAEでは rlfetch API のラッパーとしてサポートされています。 urllib3はGAEで利用できないいくつかのモジュールを使用しますが、この使用法は意図的に作成されます オプション なので、urllib3はGAEで使用できます。

8
Piotr Dobrogost

いいえ、 もっと最近の投稿 では、Pythonとの違いが大きいため、開発者はGAEをサポートしていないと言っています。

3
Ann Kilzer

Google App Engineで動作するようにリクエストを修正すると同時に、アプリケーションをGAEの外部で実行できるようにするために、次のコードを追加しました。

try:
    from google.appengine.api import urlfetch
    from requests_toolbelt.adapters import appengine
    appengine.monkeypatch()
except ImportError:
    pass
0
remeika

はい、リクエストモジュールを使用できます。 GCPは、そのまま使用できるRequestsライブラリの使用をサポートしていません。したがって、それを機能させるには、数週間を費やす必要があります。 Google App Engineにアプリケーションをデプロイするには、main.py(main python flask appが存在する)とapp.yaml)を作成する必要があります。 (GCPで実行するために必要な設定ファイル)python 2.7環境用のapp.yamlファイルのサンプルコードは次のとおりです

runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  redirect_http_response_code: 301
  script: main.app

libraries:
- name: flask
  version: 0.12

次に、URLfetchを内部で使用するようにリクエストライブラリを構成する必要があります。リクエストを使用するには、ベンダーの指示を使用してリクエストとrequests-toolbeltの両方をインストールする必要があります。 ( https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27#installing_a_library )。基本的に、カスタムライブラリをインストールする必要があります。

  1. Lib/mkdirlibなどのサードパーティライブラリを保存するディレクトリを作成します
  2. システムからリクエストおよびrequests-toolbeltライブラリをアップロードするか、前の手順で作成したlibフォルダーに直接ダウンロードします。
  3. -tフラグを指定してpip(バージョン6以降)を使用して、前の手順で作成したフォルダーにライブラリーをコピーします。例:pip install -t lib /(pip install -t lib/requests)
  4. App.yamlファイルと同じフォルダーにappengine_config.pyという名前のファイルを作成します。
  5. Appengine_config.pyファイルを編集し、ライブラリディレクトリをvendor.add()メソッドに提供します。 appengine_config.pyファイルのサンプル

    from google.appengine.ext import vendor
    # Add any libraries install in the "lib" folder.
    vendor.add('lib/requests')
    vendor.add('lib/requests_toolbelt')
    
  6. インストールしたら、requests_toolbelt.adapters.appengineモジュールを使用して、URLFetchを使用するようにリクエストを設定します。以下のコードをmain.pyファイルの先頭にコピーします

    import requests
    from requests_toolbelt.adapters import appengine
    appengine.monkeypatch(validate_certificate=True)
    

https://cloud.google.com/appengine/docs/standard/python/issue-requests

これで、リクエストライブラリを使用してget/postリクエストを簡単に作成できます。アプリをテストします。

dev_appserver.py --port=<port number> app.yaml
0
Jatin