Advertisement
AntonioVillanueva

RESTfull Web Server avec AUTH et base de données externe

Jan 11th, 2023 (edited)
897
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.12 KB | None | 0 0
  1. """ serveur REST web ,avec exbase de données externe et basic AUTH
  2.  
  3. dépendances:
  4.  
  5. sudo apt install python3-pip
  6. pip3 install Flask
  7. pip3 install Flask-HTTPAuth
  8.  
  9. Cette version charge la base de données ext. à partir d'un fichier
  10. p.e externe data.txt
  11.  
  12. Example contenu du fichier externe "data.txt"
  13.  
  14. {"db":[
  15.          {
  16.          "id":"1",
  17.          "name":"Albert",
  18.          "title":"Chercheur"
  19.          },
  20.          {
  21.          "id":"2",
  22.          "name":"Isaac",
  23.          "title":"physicien"
  24.          },
  25.          {
  26.          "id":"3",
  27.          "name":"Antonio Villanueva",
  28.          "title":"developpeur"
  29.          },
  30.          {
  31.          "id":"4",
  32.          "name":"Franck Clerissi",
  33.          "title":"Charge d affaires "
  34.          }
  35.     ]
  36. }
  37.  
  38. Example Commandes que nous pouvons exécuter dans curl
  39.  
  40. getAllEmp
  41. curl -i http://localhost:5000/axiome/employe/
  42. getEmp
  43. curl -i http://localhost:5000/axiome/employe/{$id}
  44. default
  45. curl -i http://localhost:5000
  46. updateEmp
  47. curl -i -H "Content-type: application/json" -X PUT -d '{"title":"esclave"}' http://localhost:5000/axiome/employe/1 -u"axiome:concept"
  48. createEmp
  49. curl -i -H "Content-type: application/json" -X POST -d '{"id":"69","name":"Angus","title":"guitar"}' http://localhost:5000/axiome/employe/ -u"axiome:concept"
  50. Delete
  51. curl -i -X DELETE http://localhost:5000/axiome/employe/1 -u"axiome:concept"
  52.  
  53. """
  54. from flask import Flask
  55. from flask_httpauth import HTTPBasicAuth #pip install Flask-HTTPAuth
  56. from flask import jsonify
  57. from flask import request
  58. from werkzeug.security import generate_password_hash, check_password_hash
  59. import json
  60. import os,sys #For path file ;)
  61.  
  62. app = Flask(__name__)
  63.  
  64. auth = HTTPBasicAuth()
  65.  
  66. BASE_WEB_ADDRESS="/axiome/employe/" #Adresse de base de l'adresse Web RESTful
  67. hostname ="localhost" # ip ... ou 127.0.0.1 pour tests
  68. PORT=5000 #Port RESTfull web server
  69. EXT_JSON_FILE="data.txt" #fichier de base de données externe
  70.  
  71. """ login:pwd"""
  72. users = {
  73.     "axiome": generate_password_hash("concept"),
  74.     "tony": generate_password_hash("icaro")
  75. }
  76.  
  77. @auth.verify_password
  78. def verify_password(username, password):
  79.     if username in users and \
  80.             check_password_hash(users.get(username), password):
  81.         return username
  82.  
  83. @app.route("/")
  84. def default():
  85.     """page Web par défaut """
  86.     return jsonify({'Base Web address':BASE_WEB_ADDRESS})
  87.  
  88. @app.route(BASE_WEB_ADDRESS,methods=['GET'])
  89. def getAllEmp():
  90.     """renvoie toute la base de données """
  91.     return jsonify(employesDB)
  92.    
  93. @app.route(BASE_WEB_ADDRESS+'<empId>',methods=['GET'])
  94. def getEmp(empId):
  95.     usr=[]
  96.     for elem in employesDB['db']:#Loops over dictionary in db list
  97.         for key,value in elem.items():
  98.             if key=='id' and value == empId:
  99.                 usr=elem
  100.            
  101.     return jsonify({'employe':usr})    
  102.  
  103. @app.route(BASE_WEB_ADDRESS,methods=['POST'])
  104. @auth.login_required
  105. def createEmp():
  106.     """ Créer un nouvel employé"""
  107.     dat = {
  108.     'id':request.json['id'],
  109.     'name':request.json['name'],
  110.     'title':request.json['title']
  111.     }
  112.     employesDB['db'].append(dat)
  113.     return jsonify(dat)
  114.  
  115. @app.route(BASE_WEB_ADDRESS+'<empId>',methods=['PUT'])
  116. @auth.login_required
  117. def updateEmp(empId):
  118.     """mettre à jour un employé dans la base de données """ 
  119.     for elem in employesDB['db'] : #Loop over list -> dicts
  120.         #look over list elem
  121.         if elem['id'] ==empId:
  122.             if 'name' in request.json :
  123.                 elem['name']=request.json['name']
  124.             if 'title' in request.json :               
  125.                 elem['title']=request.json['title']
  126.        
  127.     return getEmp(empId)    
  128.    
  129.    
  130. @app.route(BASE_WEB_ADDRESS+'<empId>',methods=['DELETE'])
  131. @auth.login_required
  132. def deleteEmp(empId):
  133.     """Efface employe dans employeeDB """  
  134.     for index,item in enumerate(employesDB['db']):
  135.         for key,value in item.items():
  136.             if key=='id' and value ==empId:
  137.                 #find=index
  138.                 employesDB['db'].pop(index)
  139.  
  140.     return jsonify({'response':'delete employe'+empId})
  141.  
  142. if __name__ == "__main__":
  143.    
  144.     #Opening extern JSON file see example in ligne 7
  145.     #fichier = open('data.txt')
  146.     fichier = open(os.path.join(sys.path[0], EXT_JSON_FILE), "r")  
  147.    
  148.     employes=json.load(fichier) #To parse JSON from file json.load() returns dictionary
  149.     fichier.close()
  150.  
  151.     employesDB=employes
  152.     print ("Type ",type (employesDB),employesDB)
  153.    
  154.     #app.run()
  155.     app.run( host=hostname,port=PORT)
  156.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement