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.
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 :
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__
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 404content = "", par défaut vide, qui représente le contenu texte de la page__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.error_code = 501filename, 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)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 = 501content, la valeur de l'attribut content de l'objet est actualisée.entete(self) -> str renvoie l'entête d'une réponse html selon le code html. Je détaille plus bas les entêtes.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.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).is_html(self, filename:str) -> bool qui renvoie True si le nom est bien de la forme *.htmlencode(self) qui renvoie l'entête correspondant à error_code suivi du contenu content le tout encodé en utf8.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 internet.
Pour une erreur 404 :
<!DOCTYPE html PUBLIC><html><head><meta charset="UTF-8"></head><body>Erreur 404 : Fichier n'existe pas.</body></html>
Pour une erreur 501 :
<!DOCTYPE html PUBLIC><html><head><meta charset="UTF-8"></head><body>Erreur 501 : Erreur sur le serveur.</body></html>