diff --git a/site-web/acces_base_de_donnees.py b/site-web/acces_base_de_donnees.py new file mode 100644 index 0000000000000000000000000000000000000000..a68b2dbfacf2f534f92cd83c4ee94d4b179668bd --- /dev/null +++ b/site-web/acces_base_de_donnees.py @@ -0,0 +1,73 @@ +from sqlalchemy.ext.declarative import declarative_base + +from sqlalchemy import create_engine +from sqlalchemy.orm import scoped_session, sessionmaker +from sqlalchemy import Column, Integer, String + +Base = declarative_base() + +template = f"""<!DOCTYPE html> +<html lang="fr"> + <head> + <meta charset="utf-8"> + <title>Baskets Nike</title> + </head> + <body> + <h1>Liste des modèle Nike disponible</h1> + <h2>Le métier d'ingénieur</h2> + <p>Bonjour</p> + <ol> + <li>BAC L</li> + <li>BAC ES</li> + <li>BAC S</li> + <ol> + <p><img src="protocole-http.png"></p> + </body> +</html> +""" + +base = """<!DOCTYPE html> +<html lang="fr"> + <head> + <meta charset="utf-8"> + <title>Baskets Nike</title> + </head> + <body> + <h1>Liste des modèle Nike disponibles</h1>""" + +fin = """</body> +</html> +""" + +class BasketNike(Base): + __tablename__ = 'nike' + + id = Column(Integer, primary_key=True) + modele = Column(String) + couleur = Column(String) + image = Column(String) + stock = Column(Integer) + + def __repr__(self): + return "{0} : modèle {1}, couleur {2}, stock {3}".format( + self.id, + self.modele, + self.couleur, + self.stock + ) + +if __name__ == '__main__': + engine = create_engine("sqlite:///basket.db", echo=False) + DBSession = scoped_session(sessionmaker()) + DBSession.configure(bind=engine, autoflush=False, expire_on_commit=False) + + print(base) + for b in DBSession.query(BasketNike).all(): + print(f"""<div> + <div id="modele">{b.modele}</div> + <div id="stock">couleur: {b.couleur}, stock: {b.stock}</div> + <div id="image_basket"><img src="./{b.image}"></div> + </div> + """) + + print(fin) diff --git a/site-web/basket.db b/site-web/basket.db new file mode 100644 index 0000000000000000000000000000000000000000..75c3b0bc68599099ad7c60a28ba5adab625e0ab4 Binary files /dev/null and b/site-web/basket.db differ diff --git a/site-web/mon_serveur_commerce.py b/site-web/mon_serveur_commerce.py new file mode 100644 index 0000000000000000000000000000000000000000..0869b2c1fb0ebf9276fc0c2a41ddc52979827892 --- /dev/null +++ b/site-web/mon_serveur_commerce.py @@ -0,0 +1,98 @@ +from http.server import BaseHTTPRequestHandler +import os +from urllib import parse + +from sqlalchemy import create_engine +from sqlalchemy.orm import scoped_session, sessionmaker + +from acces_base_de_donnees import Base, BasketNike + + +engine = create_engine("sqlite:///basket.db", echo=False) +DBSession = scoped_session(sessionmaker()) +DBSession.configure(bind=engine, autoflush=False, expire_on_commit=False) + + +def pageBasket(marque): + base = """<!DOCTYPE html> + <html lang="fr"> + <head> + <meta charset="utf-8"> + <link rel="stylesheet" href="style_commerce.css"> + <title>Baskets Nike</title> + </head> + <body> + <h1>Liste des modèle Nike disponibles</h1>""" + + fin = """</body> + </html>""" + + message = base + + for b in DBSession.query(BasketNike).all(): + message += '<div class="fiche">' + message += f'<div class="modele">{b.modele}</div>' + message += f'<div class="stock">couleur: {b.couleur}, stock: {b.stock}</div>' + message += f'<div classs="image_basket"><img src="./{b.image}"></div>' + message += '</div>' + + message += fin + + return message + + +class GestionGET(BaseHTTPRequestHandler): + + def recupereFichier(self): + self.mime_types = { + '.jpeg': ('image/jpeg', 'rb'), + '.jpg': ('image/jpg', 'rb'), + '.png': ('image/png', 'rb'), + '.html': ('text/html', 'r'), + '.css': ('text/css', 'r'), + '.js': ('application/x-javascript', 'r') + } + parsed_path = parse.urlparse(self.path) + + filebase, ext = os.path.splitext(os.path.basename(parsed_path.path)) + # TODO gerer ext vide + filename = f'{filebase}{ext}' + + if os.path.exists(filename): + mode = self.mime_types[ext][1] + + with open(filename, mode) as f: + contenu = f.read() + else: + if 'basket' in filename: + ext = ext if len(ext) > 0 else '.html' + return pageBasket('Nike'), ext + else: + contenu = None + + return contenu, ext + + def do_GET(self): + message, ext = self.recupereFichier() + + if message is None: + self.send_response(404) + self.end_headers() + else: + mimetype = self.mime_types[ext][0] + + self.send_response(200) + self.send_header('Content-Type', + f'{mimetype}; charset=utf-8') + self.end_headers() + if self.mime_types[ext][1] == 'r': + self.wfile.write(message.encode('utf-8')) + else: + self.wfile.write(message) + + +if __name__ == '__main__': + from http.server import HTTPServer + server = HTTPServer(('localhost', 8080), GestionGET) + print('Starting server, use <Ctrl-C> to stop') + server.serve_forever() diff --git a/site-web/nike_air_force_1.jpeg b/site-web/nike_air_force_1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..75afb7a583567df9dc8936949aa0e66f3f9fd086 Binary files /dev/null and b/site-web/nike_air_force_1.jpeg differ diff --git a/site-web/nike_air_max_metallic.jpeg b/site-web/nike_air_max_metallic.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..a748073f5fbbef7abfcfc612c8c61fcf7997aa6c Binary files /dev/null and b/site-web/nike_air_max_metallic.jpeg differ diff --git a/site-web/nike_mk2_tekno.jpeg b/site-web/nike_mk2_tekno.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..908858aa4d9a88968a3e677af35887b0dce87dbf Binary files /dev/null and b/site-web/nike_mk2_tekno.jpeg differ diff --git a/site-web/style_commerce.css b/site-web/style_commerce.css new file mode 100644 index 0000000000000000000000000000000000000000..e8c6209152cd21c7f23e2ca8c1382f74723aede7 --- /dev/null +++ b/site-web/style_commerce.css @@ -0,0 +1,18 @@ +h1 { + color: maroon; + border-bottom: solid 4px maroon; +} + +.fiche { + border: solid 2px blue; + margin: 10px; + float: left; +} + +.modele { + font-weight: bold; +} + +.stock { + font-style: italic; +} \ No newline at end of file