web-dev-qa-db-fra.com

Testez Python Google Cloud Functions localement

J'essaie le runtime Python3.7 sur Google Cloud Functions. Je suis en mesure de déployer les fonctions et de les faire fonctionner une fois déployées, mais je n'arrive pas à exécuter l'émulateur pour les tester localement avant de déployer.

La documentation de Google est un peu incohérente où ils vous disent d'installer l'émulateur de fonctions Google ici: https://cloud.google.com/functions/docs/emulator

Mais sur Firebase, ils vous disent de npm install firebase-admin, firebase-tools et firebase-functions.

Toute la documentation de l'émulateur fait référence à des exemples écrits en JS, aucun dans Python donc je me demande si ces émulateurs exécutent même Python fonctionne localement?

Merci

12
Michael Gradek

Il n'y a pas d'émetteur Python pour les fonctions cloud.

Si vous voulez pouvoir exécuter votre fonction HTTP localement, vous pouvez l'encapsuler dans une application Flask comme ceci:

def my_function(request):
    return 'Hello World'

if __name__ == "__main__":
    from flask import Flask, request
    app = Flask(__name__)

    @app.route('/')
    def index():
        return my_function(request)

    app.run('127.0.0.1', 8000, debug=True)
14
Dustin Ingram

Sur la base de la réponse de Dustin, j'ai développé un package pour servir d'émulateur:

pip install gcp-functions-emulator

Étant donné que vous souhaitez remplir la fonction suivante

# mycloudfunction.py
def api(request):
  return 'important data'

Pour émuler, nous devons l'appeler ainsi:

gcpfemu <path/to/file.py> <function_name>

Par exemple, avec le code ci-dessus, nous l'appellerons:

gcpfemu mycloudfunction.py api

Et pour accéder aux données que nous pouvons utiliser par exemple curl:

curl localhost:5000/api
> important data
6
dinigo

Pour l'exécuter dans IntelliJ avec Target Type = Script Path et les options par défaut devraient ressembler à ceci:

from flask import Flask, request
app = Flask(__name__)


@app.route('/')
def hello():
    return hello_get(request)

if __name__ == '__main__':
    app.run('127.0.0.1', debug=True)
1
Sandro