====== Le module html ====== Défini dans ''%%html.py%%'', c'est un module permettant de regrouper les fonctions concernant les pages html, notamment les erreurs et les problèmes d'entêtes. Définit la classe ''%%Html%%''. Quand on parle de fichiers html ci-dessous, on suppose qu'ils se trouvent dans ''%%FileManager.BASE_URL%%''. La classe nécessitera d'ailleurs l'utilisation de la classe ''%%FileManager%%''. Vous pouvez tester le bon fonctionnement avec le module de test : {{ .:html.test.py |}}. ===== Initialisation ===== Un objet ''%%Html%%'' devra représenter une page. Lors de la création de l'objet on pourra préciser le contenu de plusieurs façons : * donner un code d'erreur, pour générer la page d'erreur automatiquement, * donner le contenu de la page sous forme d'un texte, * donner un nom de fichier html dont on charge le contenu. Mais comment indiquer ce choix ? Python propose une syntaxe élégante : # on souhaite pouvoir appeler une fonction fct avec diverses options : fct(error_code=200) fct(content='pwet') fct(filename='exemple.html') # voici comment définir la fonction def fct(**options): # options contient un dictionnaire avec les options # par ex, dans le premier cas, options = {"error_code":200} # dans le 2e cas, options = {"content":"pwet"} # dans le 3e cas, options = {"filename":"exemple.html"} # il suffit donc de tester ce que contient options pour savoir quoi faire ! Cette explication vous aidera pour la méthode ''%%__init__%%'' ===== Interface de la classe Html ===== * attribut ''%%error_code = 200%%'', 200 étant la valeur par défaut et qui précise la valeur du code d'erreur en cours -- //le code d'erreur est utilisé pour les pages d'erreurs comme 404// * attribut ''%%content = ""%%'', par défaut vide, qui représente le contenu texte de la page * méthode ''%%__init__(self, **options)__%%''. Comme expliqué précédemment, ''%%**options%%'' permet de recevoir des arguments variables. Dans la méthode, ''%%options%%'' sera un dictionnaire qui devra contenir l'une des options : ''%%filename%%'', ''%%error_code%%'' ou ''%%content%%''. * En l'absence de ces 3 options, on agira par défaut comme si c'était ''%%error_code = 501%%'' * si ''%%filename%%'', tentative de chargement du fichier en mode texte, dans la partie publique du site. Si succès, le contenu est placé dans l'attribut ''%%content%%'' de l'objet. Sinon, on bascule sur ''%%error_code = 404%%'' (not found) * si ''%%error_code%%'', avec ''%%error_code%%'' une valeur acceptée, on affecte l'attribut ''%%error_code%%'' et on génère la page d'erreur correspondante dans ''%%content%%'' (voir les méthodes suivantes). Si ''%%error_code%%'' n'est pas valable, on prend par défaut ''%%error_code = 501%%'' * si ''%%content%%'', la valeur de l'attribut ''%%content%%'' de l'objet est actualisée. * méthode ''%%entete(self) -> str%%'' renvoie l'entête d'une réponse html selon le code html. Je détaille plus bas les entêtes. * méthode ''%%load_default_error_page(self)%%'' qui selon ''%%error_code%%'' modifie l'attribut ''%%content%%'' pour un code html par défaut. Voir plus bas pour les messages par défaut. On n'acceptera que les erreurs 404 et 501. * méthode ''%%load_error_page(self)%%'' qui selon ''%%error_code%%'' teste l'existence d'une page d'erreur, par exemple un fichier ''%%404.html%%''. S'il existe, charge cette page dans l'attribut ''%%content%%'', sinon charge la page par défaut (méthode précédente). * méthode ''%%is_html(self, filename:str) -> bool%%'' qui renvoie ''%%True%%'' si le nom est bien de la forme ''%%*.html%%'' * méthode ''%%encode(self)%%'' qui renvoie l'entête correspondant à ''%%error_code%%'' suivi du contenu ''%%content%%'' le tout encodé en ''%%utf8%%''. ===== Entêtes ===== Voici par exemple l'entête pour un chargement avec succès (code 200) HTTP/1.1 200 OK host: le site local Content-Type: text/html Mais il y a des caractères cachés extrêmement importants. À chaque saut de ligne ''%%\r\n%%'' et deux fois ''%%\r\n%%'' à la fin. On pourra donc l'écrire : "HTTP/1.1 200 OK\r\nhost: le site local\r\nContent-Type: text/html\r\n\r\n" Pour une erreur 404 HTTP/1.1 404 Not Found\r\n host: le site local\r\n Content-Type: text/html\r\n\r\n ou encore pour une erreur 501 HTTP/1.1 501 Not Implemented host: le site local Content-Type: text/html\n Ces trois codes suffisent pour l'instant. Au besoin vous trouverez les autres facilement sur [[https://fr.wikipedia.org/wiki/Liste_des_codes_HTTP|internet]]. ===== Pages d'erreur par défaut ===== Pour une erreur 404 : Erreur 404 : Fichier n'existe pas. Pour une erreur 501 : Erreur 501 : Erreur sur le serveur.