mini-serveur.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. from http.server import BaseHTTPRequestHandler, HTTPServer
  2. import importlib
  3. # module = importlib.import_module('controlers')
  4. import controleurs
  5. base_html = """<!DOCTYPE html>
  6. <html>
  7. <head>
  8. <title>Mini-Serveur</title>
  9. <style>
  10. input {
  11. padding: 4px 12px;
  12. border: 1px solid #ddd;
  13. border-radius: 4px;
  14. margin-bottom: 10px;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <nav>
  20. <a href="/">Home</a> |
  21. <a href="/login">Login</a> |
  22. <a href="/register">Register</a>
  23. </nav>
  24. {body}
  25. </body>
  26. </html>
  27. """
  28. # HTTPRequestHandler class
  29. class MiniHTTPServerRequestHandler(BaseHTTPRequestHandler):
  30. paths = {
  31. "/": "HomeController",
  32. "/login": "LoginController",
  33. "/register": "RegisterController"
  34. }
  35. # GET
  36. def do_GET(self):
  37. if not self.path in self.paths.keys():
  38. self.send_response(404)
  39. self.end_headers()
  40. return
  41. controller_class = self.paths[self.path]
  42. print(controller_class)
  43. class_ = getattr(controleurs, controller_class)
  44. instance = class_()
  45. html = instance.do_GET()
  46. # Send response status code
  47. self.send_response(200)
  48. # Send headers
  49. self.send_header('Content-type','text/html')
  50. self.end_headers()
  51. # Send message back to client
  52. message = base_html.replace("{body}", html)
  53. # Write content as utf-8 data
  54. self.wfile.write(bytes(message, "utf8"))
  55. return
  56. # POST: copier-coller en grande partie de do_GET:
  57. # - on a ajouté deux lignes au début
  58. # - on renvoie au client ce qu'il nous a envoyé (message = post_body)
  59. def do_POST(self):
  60. if not self.path in self.paths.keys():
  61. self.send_response(404)
  62. self.end_headers()
  63. return
  64. # Cette ligne récupère le(s) header(s) content-length
  65. # Même s'il n'y en a qu'un, get_all() renvoie une liste d'un élément
  66. content_len_headers = self.headers.get_all('content-length')
  67. # Si cette liste est vide, on ne peut pas continuer, car on ne sait pas combien
  68. # d'octets on doit lire : on renvoie une réponse avec code 400 (Bad Request)
  69. if not content_len_headers:
  70. self.send_response(400)
  71. self.end_headers()
  72. return
  73. # On convertit en entier la valeur string contenue dans le header content-type
  74. content_len = int(content_len_headers[0])
  75. # On lit ce nombre d'octets dans la requête
  76. post_body = self.rfile.read(content_len)
  77. # On convertit en chaîne le body
  78. body_str = str(post_body, 'utf-8')
  79. controller_class = self.paths[self.path]
  80. print(controller_class)
  81. class_ = getattr(controleurs, controller_class)
  82. instance = class_()
  83. html = instance.do_POST(body_str)
  84. # Send response status code
  85. self.send_response(200)
  86. # Send headers
  87. self.send_header('Content-type','text/html')
  88. self.end_headers()
  89. # On renvoie cela tel quel au client
  90. message = base_html.replace("{body}", html)
  91. # Write content as utf-8 data
  92. self.wfile.write(bytes(message, "utf8"))
  93. return
  94. def run():
  95. print('starting server...')
  96. # Server settings
  97. # Choose port 8080, for port 80, which is normally used for a http server, you need root access
  98. server_address = ('127.0.0.1', 8081)
  99. httpd = HTTPServer(server_address, MiniHTTPServerRequestHandler)
  100. print('running server...')
  101. httpd.serve_forever()
  102. run()