web-dev-qa-db-fra.com

La bibliothèque de requêtes Python peut-elle être utilisée sur Google App Engine?

Puis-je utiliser Requests sur Google App Engine? Je pense que cette bibliothèque est parfaite pour créer un client REST.

31

Oui. Sur Google Appengine (version 1.9.18) requestversion 2.3.0 fonctionne EN PRODUCTION (mais pas sur SDK) si la facturation est activée, ce qui active la prise en charge des sockets. 

Mise à jour : Depuis le 31 janvier 2017, Requests travaille en production avec la version 2.9.1 en production. Cependant, cela ne fonctionne pas avec Google Cloud SDK 141.0.0

les demandes sur le kit de développement logiciel Appengine échouent avec toutes les demandes https: //:

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

demande la version 2.4.1 échoue en production avec:

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

demande la version 2.5.1 échoue en production avec:

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

request version 2.3.0 fonctionne en production, mais peut entraîner des problèmes de suppression de la prise en charge de SSLv3 dans le SDK par Debians (request 2.3.0 est livré avec son propre urllib3, désormais obsolète). En guise de solution de contournement, il est possible de supprimer la ligne contenant PROTOCOL_SSLv3 dans la source de la copie urllib3. 

  'module' object has no attribute 'PROTOCOL_SSLv3'

Informations sur le support des sockets: https://cloud.google.com/appengine/docs/python/sockets/

26
cat

Installez la bibliothèque requests-toolbelt: https://github.com/sigmavirus24/requests-toolbelt

Pour App Engine, cela pourrait être quelque chose comme: pip install requests-toolbelt -t lib 

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

Puis ajouter:

from requests_toolbelt.adapters import appengine
appengine.monkeypatch()

Dans votre main.py ou équivalent.

Modifier : cette solution fait désormais partie de la documentation officielle: https://cloud.google.com/appengine/docs/python/issue-requests#issuing_an_http_request (In l'onglet REQUESTS)

37
Eyal Levin

c'est maintenant possible, je l'ai obtenu en utilisant cette combinaison de solutions de contournement dans 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

Pas encore, mais j'espère très bientôt. Nous travaillons actuellement à la prise en charge de GAE - voir le problème # 498 (correctifs du moteur d’application).

Requests utilise urllib3 qui à son tour utilise httplib qui est pris en charge sur GAE en tant que wrapper pour urlfetch API . Bien que urllib3 utilise certains modules non disponibles sur GAE, cette utilisation est faite délibérément optionnel de sorte que urllib3 puisse être utilisé sur GAE.

8
Piotr Dobrogost

Non, dans un billet plus récent , les développeurs disent qu'ils ne supportent pas GAE car il est trop différent de python.

3
Ann Kilzer

Pour corriger les requêtes afin qu'elles fonctionnent avec Google App Engine, mais également pour permettre à mon application de fonctionner en dehors de GAE, j'ai ajouté le code suivant:

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

Oui, vous pouvez utiliser le module de demandes. GCP ne prend pas en charge l’utilisation immédiate de la bibliothèque de demandes. Il faudra donc faire quelques efforts pour que cela fonctionne. Pour déployer une application sur Google App Engine, nous devons créer un fichier main.py (où réside l’application principale du flacon python) et app.yaml. (fichier de configuration nécessaire pour l’exécuter dans GCP). Voici un exemple de code pour le fichier app.yaml pour l’environnement python 2.7

runtime: python27
api_version: 1
threadsafe: true

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

libraries:
- name: flask
  version: 0.12

Maintenant, nous devons configurer la bibliothèque de requêtes pour utiliser URLfetch en interne. Pour utiliser les requêtes, nous devons installer les requêtes et les demandes-toolbelt à l'aide des instructions de vente. ( https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27#installing_a_library ). En gros, nous devons installer nos bibliothèques personnalisées.

  1. Créez un répertoire pour stocker vos bibliothèques tierces, tel que lib / Mkdir lib
  2. Téléchargez les bibliothèques request et toolbelt de votre système ou téléchargez-les directement dans le dossier lib créé à l'étape précédente.
  3. Utilisez pip (version 6 ou ultérieure) avec l'indicateur -t pour copier les bibliothèques dans le dossier que vous avez créé à l'étape précédente. Par exemple: Pip install -t lib/(pip install -t lib/request)
  4. Créez un fichier nommé appengine_config.py dans le même dossier que votre fichier app.yaml.
  5. Editez le fichier appengine_config.py et fournissez votre répertoire de bibliothèque à la méthode vendor.add (). Exemple de fichier appengine_config.py

    du fournisseur d'importation google.appengine.ext

    Ajoutez toutes les bibliothèques installées dans le dossier "lib".

    vendor.add ('lib/request') vendor.add ('lib/request_toolbelt')

  6. Une fois installé, utilisez le module tasks_toolbelt.adapters.appengine pour configurer les demandes d'utilisation d'URLFetch. Copiez le code ci-dessous au début de votre fichier main.py.

    demandes d'importation à partir de demandes_toolbelt.adapters import importent appengine.monkeypatch (validate_certificate = True)

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

Maintenant, nous pouvons facilement utiliser la bibliothèque de requêtes pour faire des requêtes de get/post. Testez votre application: 

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