6.7. Développer des fonctions Python
OpenShift Serverless Functions with Python est une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes sur le plan fonctionnel. Red Hat ne recommande pas de les utiliser en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.
Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.
Après avoir créé un projet de fonction Python, vous pouvez modifier les fichiers modèles fournis pour ajouter une logique commerciale à votre fonction. Il s'agit notamment de configurer l'invocation de la fonction ainsi que les en-têtes et les codes d'état renvoyés.
6.7.1. Conditions préalables
- Avant de pouvoir développer des fonctions, vous devez suivre les étapes de la section Configuration des fonctions OpenShift Serverless.
6.7.2. Structure du modèle de fonction Python
Lorsque vous créez une fonction Python en utilisant l'interface de programmation Knative (kn
), le répertoire du projet ressemble à un projet Python classique. Les fonctions Python ont très peu de restrictions. Les seules exigences sont que votre projet contienne un fichier func.py
qui contient une fonction main()
et un fichier de configuration func.yaml
.
Les développeurs ne sont pas limités aux dépendances fournies dans le fichier modèle requirements.txt
. Des dépendances supplémentaires peuvent être ajoutées comme dans tout autre projet Python. Lorsque le projet est construit pour être déployé, ces dépendances seront incluses dans l'image du conteneur d'exécution créé.
Les fonctions de déclenchement http
et event
ont la même structure de modèle :
Structure du modèle
fn ├── func.py 1 ├── func.yaml 2 ├── requirements.txt 3 └── test_func.py 4
- 1
- Contient une fonction
main()
. - 2
- Utilisé pour déterminer le nom et le registre de l'image.
- 3
- Des dépendances supplémentaires peuvent être ajoutées au fichier
requirements.txt
comme dans tout autre projet Python. - 4
- Contient un test unitaire simple qui peut être utilisé pour tester votre fonction localement.
6.7.3. A propos de l'invocation des fonctions Python
Les fonctions Python peuvent être invoquées à l'aide d'une simple requête HTTP. Lorsqu'une requête est reçue, les fonctions sont invoquées avec un objet context
comme premier paramètre.
L'objet context
est une classe Python dotée de deux attributs :
-
L'attribut
request
est toujours présent et contient l'objet Flaskrequest
. -
Le deuxième attribut,
cloud_event
, est renseigné si la demande entrante est un objetCloudEvent
.
Les développeurs peuvent accéder à toutes les données de CloudEvent
à partir de l'objet contextuel.
Exemple d'objet contextuel
def main(context: Context): """ The context parameter contains the Flask request object and any CloudEvent received with the request. """ print(f"Method: {context.request.method}") print(f"Event data {context.cloud_event.data}") # ... business logic here
6.7.4. Valeurs de retour des fonctions Python
Les fonctions peuvent renvoyer n'importe quelle valeur prise en charge par Flask. En effet, le cadre d'invocation transmet ces valeurs directement au serveur Flask.
Exemple :
def main(context: Context): body = { "message": "Howdy!" } headers = { "content-type": "application/json" } return body, 200, headers
Les fonctions peuvent définir des en-têtes et des codes de réponse en tant que valeurs de réponse secondaires et tertiaires à partir de l'invocation de la fonction.
6.7.4.1. Retourner les CloudEvents
Les développeurs peuvent utiliser le décorateur @event
pour indiquer à l'invocateur que la valeur de retour de la fonction doit être convertie en CloudEvent avant d'envoyer la réponse.
Exemple :
@event("event_source"="/my/function", "event_type"="my.type") def main(context): # business logic here data = do_something() # more data processing return data
Cet exemple envoie un CloudEvent comme valeur de réponse, avec un type de "my.type"
et une source de "/my/function"
. La propriété CloudEvent data
est définie sur la variable data
renvoyée. Les attributs décoratifs event_source
et event_type
sont tous deux facultatifs.
6.7.5. Test des fonctions Python
Vous pouvez tester les fonctions Python localement sur votre ordinateur. Le projet par défaut contient un fichier test_func.py
, qui fournit un test unitaire simple pour les fonctions.
Le cadre de test par défaut pour les fonctions Python est unittest
. Vous pouvez utiliser un autre cadre de test si vous le souhaitez.
Conditions préalables
Pour exécuter localement des tests de fonctions Python, vous devez installer les dépendances nécessaires :
$ pip install -r requirements.txt
Procédure
-
Naviguez jusqu'au dossier de votre fonction qui contient le fichier
test_func.py
. Exécutez les tests :
$ python3 test_func.py
6.7.6. Prochaines étapes
- Construire et déployer une fonction.