Exécuter un script avec payload lors d’un POST request et renvoyer le JSON résultant

Bonjour à tous,

Je cherche à :

  • recevoir un POST https sur une adresse d’un serveur que je fais tourner
  • traiter sur le serveur la requête en faisant tourner un script Python de scrapping (qui fonctionne déjà en l’exécutant en local) en récupérant des infos dans l’en-tête de la requête
  • renvoyer un JSON (actuellement ça le génère dans un fichier en local)

Je suis à peu près sûr que ce n’est pas le plus compliqué de gérer cet aller-retour (comparé au script en lui-même) mais je ne sais pas par quel bout le prendre :-/

Merci pour les pistes que vous voudrez bien me soumettre :slight_smile:
A+ Alexis

Ça je ne pense pas que ce soit ce qu’il y ai de plus compliqué.
Quel type de device va envoyer la requête ?

Ok. Tu récupère les paramètres du POST précédemment envoyé à ton endpoint. Je ne pourrais pas t’aider sur cette partie, je ne fais pas de python.

Normalement l’émetteur de la requête POST attend une réponse au format json.
Prenons l’exemple une web app, c’est le JavaScript coté front qui émet une requête Ajax et qui attend le Json en réponse.
Côté serveur (php par exemple) tu récupère les datas du POST, et tu lances ton script et à la fin du script tu format ton json (qui en gros est une chaîne de caractère avec les data que tu veux retourner) et tu fait un echo($json); die;
echo() c’est en gros un print() pour d’autre language.

Peux-tu nous expliquer un peu plus le cas de figure ?

L’idée est qu’une app (dev flutter) demande les infos nécessaires au script (en l’occurrence : URL, login, pwd… qui sont les infos demandées sur le site à scrapper, faute d’API fournie par le site pour obtenir proprement les infos et après une dizaine de mails pour proposer un travail collaboratif). NB : ce sont des infos qui appartiennent à l’utilisateur puisque ce sont ses propres dispos/indispos et les dates bookées chez un employeur.

Je voudrais que l’app envoie le POST à https://api.mon.serveur/nom.de.l.employeur/ (le nom de l’employeur permettant de déterminer quel script envoyer pour avoir le bon scrapping).

Le serveur se dit « oh tiens, j’exécute le script avec les infos fournies » !

Et le serveur renvoie ensuite le JSON généré qui sera traité par l’appli (cette partie fonctionne déjà avec un JSON génère par le script et qui est à dispo sur une adresse de test).

Ah oui de mémoire tu avais une app pour les intermittents

Pour la premières partie à mon avis tu trouveras ton bonheur dans la doc flutter :
https://docs.flutter.dev/cookbook/networking/fetch-data

Et pour la partie serveur, en python je pense que cette approche peut t’aider :
https://www.google.com/amp/s/www.geeksforgeeks.org/how-to-return-a-json-object-from-a-python-function/amp/

Oui, c’est bien moi :slight_smile: Il y a une appli de gestion des droits intermittents (avec une association qui pilote le projet) et une application de gestion de planning… c’est cette application déjà disponible sur App Store que je souhaite étoffer (parce que cette fonctionnalité correspond à un besoin parmi mes collègues)

La partie qui me manque, c’est justement entre les deux : envoyer des requêtes depuis l’app Flutter => aucun souci // récupérer et traiter le JSON => idem, c’est bon…

C’est vraiment la partie sur le serveur qui est floue pour moi : tu parlais de PHP dans ta première réponse, j’imaginais que ça pouvait peut-être se gérer sinon dans le fichier de config NGINX. En vrai, c’est cette micro-passerelle port entrant serveur => script Python que je ne vois pas comment gérer au mieux…

Mais du coup ton serveur est actif ?
Tu as bien ton nom de domaine qui pointe vers ton index.py ou un truc du genre ?

Encore une fois je ne connais pas ton environnement côté serveur mais voici un résumé des différentes façons (selon ton environnement) de récupérer tes infos.

https://stackoverflow.com/questions/464040/how-are-post-and-get-variables-handled-in-python

Ça y est, j’ai trouvé la solution à mon problème.

Je rappelle la problématique : j’ai un serveur qui tourne et qui sait exécuter un script python pour scrapper des données (à partir d’infos de connexions qui sont dans le script) ; je voulais pouvoir sortir ces données du script et les envoyer via une requête POST depuis une app Flutter en développement pour que chacun puisse exécuter le-dit script avec ses propres infos de connexion…

Ma solution en 5 lettres : UWSGI :slight_smile:
https://uwsgi-docs.readthedocs.io/en/latest/

Ça se lance en tâche de fond sur le serveur et ça intercepte les requêtes pour les envoyer au script…

path_provided = ""

request_body = environ['wsgi.input'].read(request_body_size)
vals = parse_qs(request_body)
thePath = vals.get(b"path")
if thePath:
    path_provided = escape(thePath[0].decode("utf-8")).replace("%2F", "/")

et hop, ça joue le script avec les données d’en-tête… et ça renvoie un statut :

start_response('202 ACCEPTED', [('Content-Type', 'text/html')])
return [bytes(resultString, "utf-8")]