Table des matières
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,**optionspermet de recevoir des arguments variables. Dans la méthode,optionssera un dictionnaire qui devra contenir l'une des options :filename,error_codeoucontent.- 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'attributcontentde l'objet. Sinon, on bascule surerror_code = 404(not found) - si
error_code, avecerror_codeune valeur acceptée, on affecte l'attributerror_codeet on génère la page d'erreur correspondante danscontent(voir les méthodes suivantes). Sierror_coden'est pas valable, on prend par défauterror_code = 501 - si
content, la valeur de l'attributcontentde l'objet est actualisée.
- méthode
entete(self) -> strrenvoie 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 selonerror_codemodifie l'attributcontentpour 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 selonerror_codeteste l'existence d'une page d'erreur, par exemple un fichier404.html. S'il existe, charge cette page dans l'attributcontent, sinon charge la page par défaut (méthode précédente). - méthode
is_html(self, filename:str) -> boolqui renvoieTruesi le nom est bien de la forme*.html - méthode
encode(self)qui renvoie l'entête correspondant àerror_codesuivi du contenucontentle tout encodé enutf8.
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 internet.
Pages d'erreur par défaut
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>
