200 démons triviaux
commit
1327e6dd94
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro {{word}}.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice{{word}}
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide {{word}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 0.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice0
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 1.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice1
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala1 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 10.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice10
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 10
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala10 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 100.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice100
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 100
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala100 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 101.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice101
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 101
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala101 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 102.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice102
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 102
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala102 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 103.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice103
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 103
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala103 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 104.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice104
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 104
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala104 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 105.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice105
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 105
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala105 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 106.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice106
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 106
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala106 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 107.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice107
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 107
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala107 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 108.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice108
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 108
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala108 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 109.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice109
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 109
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala109 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 11.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice11
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 11
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala11 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 110.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice110
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 110
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala110 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 111.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice111
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 111
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala111 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)
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
cbor
|
||||||
|
flask
|
||||||
|
waitress
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
from setuptools import setup, find_packages
|
||||||
|
setup(
|
||||||
|
name="ToujoursContent",
|
||||||
|
version="0.1",
|
||||||
|
packages=find_packages(),
|
||||||
|
scripts=['daemon.py']
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
with (import <nixpkgs> {});
|
||||||
|
|
||||||
|
(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
Echauffement
|
||||||
|
------------
|
||||||
|
|
||||||
|
Exercice stupide numéro 112.
|
||||||
|
|
||||||
|
.. easypython:: ./exercice112
|
||||||
|
:language: DémonPython
|
||||||
|
:titre: Exercice Stupide 112
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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 tralala112 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)
|
||||||
|
|
@ -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()
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue