Ludovicclain. Com api rest : endpoints, tâches avec sortie, tâches en arrière-plan, sécurisation

API REST : Endpoints, Tâches avec Sortie, Tâches en Arrière-plan, Sécurisation

Nous voilà donc dans la dernière ligne droite pour configurer notre API REST.

Je vous ai rassemblé les références qui m’ont servi à aboutir ce projet à la fin de cette article, des heures de recherche et de tests (souvent infructueux) pour parvenir à ce l’API REST se comporte comme souhaité, vous allez ainsi gagner un temps précieux.

Le résumé en vidéo

Le fichier app.py final

import os
import sys
import subprocess

from flask import Flask, request, make_response, jsonify
from concurrent.futures import ThreadPoolExecutor

executor = ThreadPoolExecutor(1)

app = Flask(__name__)

# this is the entry point
application = app

from flask_httpauth import HTTPBasicAuth
auth = HTTPBasicAuth()

@auth.get_password
def get_password(username):
    if username == 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx':
        return 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    return None

@auth.error_handler
def unauthorized():
    return make_response(jsonify({'error': 'Unauthorized access'}), 403)

# let's check order status
@app.route('/status', methods = ['POST'])
@auth.login_required
def order_status():
    request_data = request.get_json()
    
    ORDER_ID = request_data['ORDER_ID']
    
    result = subprocess.run(['/le/chemin/absolu/vers/mon_bash_script_1.sh', str(ORDER_ID)], stdout=subprocess.PIPE)
    result_string = result.stdout.decode('utf-8')
    
    return make_response(jsonify({'status': result_string.rstrip()}), 200)
    
# let's do the housework
@app.route('/clean', methods = ['POST'])
@auth.login_required
def notify_order_clean():
    request_data = request.get_json()
    
    ORDER_ID = request_data['ORDER_ID']
    CUSTOMER_EMAIL = request_data['CUSTOMER_EMAIL']

    executor.submit(order_clean, ORDER_ID, CUSTOMER_EMAIL)
    return make_response(jsonify({'Reply': 'Housework was launched in background!'}), 200)

def order_clean(arg1, arg2):
    subprocess.run(['/le/chemin/absolu/vers/mon_bash_script_2.sh', str(arg1), str(arg2)])
    print('Housework is done!')
    
if __name__ == "__main__":
    app.run()

Les références utilisées (pour comprendre et personnaliser ce projet)

Flask

Python

Ressources diverses

Cet article vous a été utile ?
Oui 👍 Non 👎
Retour en haut