Puis-je utiliser Requests sur Google App Engine? Je pense que cette bibliothèque est parfaite pour créer un client REST.
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/
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
)
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'
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.
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.
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
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.
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
vendor.add ('lib/request') vendor.add ('lib/request_toolbelt')
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