147 lines
3.7 KiB
Python
147 lines
3.7 KiB
Python
from flask import Flask, request, jsonify, make_response, session, render_template, abort
|
|
from flask_restful import Api, Resource
|
|
import jwt
|
|
from datetime import datetime, timedelta
|
|
from functools import wraps
|
|
|
|
app = Flask(__name__)
|
|
|
|
app.config['SECRET_KEY'] = 'secret'
|
|
|
|
api = Api(app)
|
|
|
|
classes = {'1':
|
|
{
|
|
'nom': 'A1',
|
|
'nombre_eleve': '15',
|
|
'eleves': {
|
|
'1': ['Mariue', 'Julien', '12'],
|
|
'2': ['Koene', 'Morice', '13'],
|
|
'3': ['Moatir', 'Pierre', '12'],
|
|
'4': ['Poiti', 'Marc', '12'],
|
|
'5': ['Areop', 'Tome', '12'],
|
|
'6': ['Cenois', 'Louis', '13'],
|
|
'7': ['Quotine', 'Maxime', '12'],
|
|
'8': ['Reval', 'Adrien', '12'],
|
|
'9': ['Fonduri', 'Juliette', '11'],
|
|
'10': ['Graconti', 'Marie', '12'],
|
|
'11': ['Henvio', 'Louise', '12'],
|
|
'12': ['Kenano', 'Bertran', '14'],
|
|
'13': ['Vertille', 'Jean-Pierre', '12'],
|
|
'14': ['Provern', 'Jean', '14'],
|
|
'15': ['Secinoi', 'Celine', '12'],
|
|
}
|
|
},
|
|
'2':
|
|
{
|
|
'nom': 'A2',
|
|
'nombre_eleve': '5',
|
|
'eleves': {
|
|
'1': ['Benar', 'Leo', '15'],
|
|
'2': ['Grovin', 'Benois', '16'],
|
|
'3': ['Xeroi', 'Amelie', '15'],
|
|
'4': ['Amonie', 'Julien', '14'],
|
|
'5': ['Surois', 'Camille', '15']
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
def token_required(func):
|
|
@wraps(func)
|
|
def decorated(*args, **kwargs):
|
|
|
|
token = None
|
|
if 'token' in request.headers:
|
|
token = request.headers['token']
|
|
|
|
if not token:
|
|
return jsonify({'Alert!': 'Pas de Token!'})
|
|
# abort(403, 'pas de token')
|
|
try:
|
|
payload = jwt.decode(token, app.config['SECRET_KEY'])
|
|
except:
|
|
# abort(403, 'token invalid')
|
|
return make_response(jsonify({'Alert!': 'Token invalid!'}))
|
|
|
|
return func(*args, **kwargs)
|
|
|
|
return decorated
|
|
|
|
|
|
@app.route('/')
|
|
def home():
|
|
if not session.get('logged_in'):
|
|
return render_template('login.html')
|
|
else:
|
|
return 'Déjà connecté'
|
|
|
|
|
|
@app.route('/public')
|
|
def public():
|
|
return 'Vous êtes bien sur la page public !'
|
|
|
|
|
|
@app.route('/auth', methods=['GET'])
|
|
@token_required
|
|
def auth():
|
|
return 'Vous êtes bien sur la page auth !'
|
|
|
|
|
|
@app.route('/login', methods=['POST'])
|
|
def login():
|
|
if request.form['username'] and request.form['password'] == '123':
|
|
session['logged_in'] = True
|
|
token = jwt.encode({
|
|
'user': 0
|
|
# 'expiration': str(datetime.utcnow() + timedelta(seconds=30))
|
|
},
|
|
app.config['SECRET_KEY'], algorithm="HS256")
|
|
return jsonify({'token': token.decode('utf-8')})
|
|
else:
|
|
return make_response('Unable to verify', 403, {'WWW-Authenticate': 'Basic realm:"Authentication Failed!'})
|
|
|
|
|
|
class Classes(Resource):
|
|
@token_required
|
|
def get(self):
|
|
return classes
|
|
|
|
@token_required
|
|
def post(self):
|
|
return classes
|
|
|
|
|
|
api.add_resource(Classes, "/classes")
|
|
|
|
|
|
class Classe(Resource):
|
|
@token_required
|
|
def get(self, id_classe):
|
|
return classes[id_classe]
|
|
|
|
@token_required
|
|
def post(self, id_classe):
|
|
return classes[id_classe]
|
|
|
|
|
|
api.add_resource(Classe, "/classes/<string:id_classe>")
|
|
|
|
|
|
class Eleve(Resource):
|
|
@token_required
|
|
def get(self, id_classe, id_eleve):
|
|
return classes[id_classe]['eleves'][id_eleve]
|
|
|
|
@token_required
|
|
def post(self, id_classe, id_eleve):
|
|
return classes[id_classe]['eleves'][id_eleve]
|
|
|
|
|
|
api.add_resource(Eleve, "/<string:id_classe>/<string:id_eleve>")
|
|
|
|
|
|
@app.route("/reset")
|
|
def reset():
|
|
session.clear()
|