Etape 2 : mise à disposition sur le web

in programming •  6 years ago  (edited)

Une fois un tel service mis en place, il est de l'ordre de l'intérêt général de le mettre à disposition de tous.
Nous allons donc devoir coder une api minimaliste pour pouvoir rendre ce service accessible via le web.
C'est ce que nous allons nous atteler dans cette partie. Et pour ce faire et rester dans le Python nous allons utiliser le microframework flask.

Initialisation du projet

  • Organisation des fichiers
    J'ai pour ma part choisi de développer mon micro serveur dans le même projet que celui de l'étape précedente, mais on peut choisir de mettre la racine où l'on souhaite.
    Pour cette partie nous auront besoin que d'une arborescence très limitée. En effet nous aurons juste besoin d'un fichier .py qui décrit le fonctionnement du serveur et d'un dossier templates qui contiendra le template de notre page d'accueil.
    On penchera donc pour la structure suivante :

    /
       server.py
       templates/
         index.html
    
  • Installation de Flask
    Flask s'installe très facilement avec pip : pip install flask
    On aura aussi besoin du package flask-uploads tout à l'heure pour gérer les uploads d'images, donc il peut être pertinent de l'installer maintenant : pip install Flask-Uploads

Développement d'un serveur basique

Nous allons commencer par un serveur très minimaliste que nous complèterons ensuite. Pour cela nous aurons seulement besoin de créer un fichier index.html et un fichier server.py.

index.html
Nous aurons seulement besoin sur notre page web d'un formulaire pour pourvoir téléverser des images vers notre serveur. Un fichier html de ce type nous convient donc amplement :

  <html>
      <head>
          <title>Détection visage</title>
      </head>
      <body>
          Veuillez soumettre une image à la détection :
          <form method=POST enctype=multipart/form-data action="">
              <input type=file name=photo>
              <input type="submit">
          </form>
      </body>
  </html>

On remarquera que nous avons laissé le champ action vide car nous n'avons pas encore créé la route pour l'upload d'images

server.py
Pour l'instant nous avons seulement besoin d'une route qui permette de renvoyer notre page html à une requête GET sur notre url.
Rien de plus simple :

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
  return render_template('index.html')


if __name__ == '__main__':
  app.run()

Notre serveur est prêt !
Pour le lancer :

export FLASK_APP=server.py
flask run

On retrouve notre page web sur localhost:5000.
C'est très bien, mais il nous manque encore la fonctionnalité principale, à savoir renvoyer les résultats de notre run.py de l'étape précédente à notre utilisateur.

Ajout de la route d'upload pour la détection

Nous allons commencer par ajouter la route dans server.py. Les requêtes que nous attendrons seront des requêtes POST sur la route /upload.

@app.route('/upload', methods=['POST'])
def upload():

Pour gérer la récupération des images nous allons utiliser le package flask_upload. Nous allons donc créer un nouveau UploadSet et le configurer de manière à définir le dossier où seront téléversées les images envoyées par les utilisateurs.

photos = UploadSet('photos', IMAGES)

app.config['UPLOADED_PHOTOS_DEST'] = 'static/img'
configure_uploads(app, photos)

Une fois ceci fait nous pouvons facilement enregistrer les images envoyées grâce à la méthode save de notre UploadSet :

    if 'photo' in request.files:
        filename = photos.save(request.files['photo'])

Nous utiliserons le package subprocess pour exécuter la commande de l'étape 1 et il ne nous reste qu'à rajouter notre route comme action dans notre template html et le tour est joué !

/!\ Il faut penser à ajouter le dossier parent de notre package "detect_visage" au path python pour que subprocess sache où le chercher.

Pour lancer le serveur :

export PYTHONPATH=$PYTHONPATH:<path_vers_parent_detect_visage>"
export  FLASK_APP=server.py
flask run

Code complet : https://github.com/ddonatien/detect_visage/releases/tag/v1

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Congratulations @defy! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 2 years!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Vote for @Steemitboard as a witness to get one more award and increased upvotes!