200 démons triviaux
This commit is contained in:
77
source/exercice0/daemon.py
Normal file
77
source/exercice0/daemon.py
Normal file
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env python
|
||||
from flask import Flask, request, jsonify
|
||||
from waitress import serve
|
||||
import os
|
||||
|
||||
def handle(event, context):
|
||||
return {
|
||||
"statusCode": 200,
|
||||
"body": {
|
||||
"_valide": True,
|
||||
"_messages": ["T'es un·e champion·ne", "C'est exactement tralala0 que j'attendais"],
|
||||
'feedbacks_html': "<div>\n<p>Exercice réussi!</p>\n<ul>\n<li>T'es un·e champion·ne</li>\n<li>C'est exactement 'b'coucou'' que j'attendais</li>\n</ul>\n</div>\n"
|
||||
}
|
||||
}
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
class Event:
|
||||
def __init__(self):
|
||||
self.body = request.get_data()
|
||||
self.headers = request.headers
|
||||
self.method = request.method
|
||||
self.query = request.args
|
||||
self.path = request.path
|
||||
|
||||
class Context:
|
||||
def __init__(self):
|
||||
self.hostname = os.getenv('HOSTNAME', 'localhost')
|
||||
|
||||
def format_status_code(resp):
|
||||
if 'statusCode' in resp:
|
||||
return resp['statusCode']
|
||||
|
||||
return 200
|
||||
|
||||
def format_body(resp):
|
||||
if 'body' not in resp:
|
||||
return ""
|
||||
elif type(resp['body']) == dict:
|
||||
return jsonify(resp['body'])
|
||||
else:
|
||||
return str(resp['body'])
|
||||
|
||||
def format_headers(resp):
|
||||
if 'headers' not in resp:
|
||||
return []
|
||||
elif type(resp['headers']) == dict:
|
||||
headers = []
|
||||
for key in resp['headers'].keys():
|
||||
header_tuple = (key, resp['headers'][key])
|
||||
headers.append(header_tuple)
|
||||
return headers
|
||||
|
||||
return resp['headers']
|
||||
|
||||
def format_response(resp):
|
||||
if resp == None:
|
||||
return ('', 200)
|
||||
|
||||
statusCode = format_status_code(resp)
|
||||
body = format_body(resp)
|
||||
headers = format_headers(resp)
|
||||
|
||||
return (body, statusCode, headers)
|
||||
|
||||
@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE'])
|
||||
@app.route('/<path:path>', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE'])
|
||||
def call_handler(path):
|
||||
event = Event()
|
||||
context = Context()
|
||||
response_data = handle(event, context)
|
||||
|
||||
resp = format_response(response_data)
|
||||
return resp
|
||||
|
||||
if __name__ == '__main__':
|
||||
serve(app, port=8082)
|
||||
52
source/exercice0/daemon.py.old
Normal file
52
source/exercice0/daemon.py.old
Normal file
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Un serveur pour répondre à une tentative étudiante
|
||||
On est content quoi qu'on nous propose…
|
||||
"""
|
||||
|
||||
import cbor
|
||||
import sys
|
||||
import json
|
||||
import signal
|
||||
from http.server import BaseHTTPRequestHandler
|
||||
import socketserver
|
||||
|
||||
|
||||
def résultat(code_etu):
|
||||
return {
|
||||
"_valide": True,
|
||||
"_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"],
|
||||
'feedbacks_html': "<div>\n<p>Exercice réussi!</p>\n<ul>\n<li>T'es un·e champion·ne</li>\n<li>C'est exactement 'b'coucou'' que j'attendais</li>\n</ul>\n</div>\n"
|
||||
}
|
||||
|
||||
|
||||
class Handler(BaseHTTPRequestHandler):
|
||||
|
||||
def do_POST(self):
|
||||
mesg=b""
|
||||
while True:
|
||||
line = self.rfile.readline().strip()
|
||||
chunk_length = int(line, 16)
|
||||
if chunk_length != 0:
|
||||
chunk = self.rfile.read(chunk_length)
|
||||
mesg+=chunk
|
||||
self.rfile.readline()
|
||||
else:
|
||||
break
|
||||
|
||||
|
||||
self.send_response(200)
|
||||
self.end_headers()
|
||||
dict_code_etu = cbor.loads(mesg)
|
||||
code_etu = dict_code_etu["code_etu"]
|
||||
print("reçu: ", code_etu)
|
||||
self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n')
|
||||
self.wfile.flush()
|
||||
|
||||
def sigterm_handler(_signo, _stack_frame):
|
||||
exit(0)
|
||||
|
||||
if __name__ == "__main__":
|
||||
signal.signal(signal.SIGTERM, sigterm_handler)
|
||||
with socketserver.TCPServer(("", 8082), Handler ) as httpd:
|
||||
httpd.serve_forever()
|
||||
3
source/exercice0/requirements.txt
Normal file
3
source/exercice0/requirements.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
cbor
|
||||
flask
|
||||
waitress
|
||||
7
source/exercice0/setup.py
Normal file
7
source/exercice0/setup.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from setuptools import setup, find_packages
|
||||
setup(
|
||||
name="ToujoursContent",
|
||||
version="0.1",
|
||||
packages=find_packages(),
|
||||
scripts=['daemon.py']
|
||||
)
|
||||
3
source/exercice0/shell.nix
Normal file
3
source/exercice0/shell.nix
Normal file
@@ -0,0 +1,3 @@
|
||||
with (import <nixpkgs> {});
|
||||
|
||||
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||
Reference in New Issue
Block a user