Interface HTML

Les fichiers utiles seront

Serveur HTTP Rudimentaire

Le module proposé permet à votre programme python de faire afficher des pages à l'adresse http://127.0.0.1:5080 et de récupérer les requêtes envoyées dans la barre d'adresse à ce serveur.

Servir une page

Pour mettre en œuvre cet exemple, il faut copier/coller le code dans un programme python situé dans un dossier contenant égaelement le module shr.py et la page page_html.html. Ensuite, il faut le lancer puis visiter l'adresse http://127.0.0.1:5080 avec son navigateur.


import shr

def mapage(arg1, arg2):
	with open ('page_html.html', 'r', encoding='utf-8') as source:
		code_page = source.read()

	return code_page

if __name__ == '__main__':
	shr.affecter_commande( "/", mapage)
	shr.servir()

À chaque fois que l'adresse est appelée, le programme python exécute la fonction «mapage», et la chaine de caractères qu'elle renvoie est transmise au navigateur.

Gérer plusieurs commandes

Dans cet exemple, on associe fon_un à la commande /page1, fon_deux à la commande /page2, et la fonction spéciale shr.stop_tp à /stop. Cette fonction arrête le serveur.

Les adresses auxquelles le serveur répond sont donc ici


import shr

def fon_un (arg1, arg2):
	return "Contenu de la page 1"

def fon_deux (arg1, arg2):
	return "Contenu de la page 2"

if __name__ == '__main__':
	shr.affecter_commande( "/stop", shr.stop_tp)
	shr.affecter_commande( "/page1", fon_un)
	shr.affecter_commande( "/page2", fon_deux)
    
	shr.servir()

Le serveur permet d'affecter plusieurs commandes à la même fonction. C'est son premier argument qui permet de savoir quelle adresse a été appelée. Dans cet exemple, la fonction fait systématiquement afficher «Bonjour !» au navigateur, et affiche l'adresse dans la console.

Les adresses à tester sont


import shr

def visualisation (arg1, arg2):
	print ('Arg1:', arg1)
	return "Bonjour !"

if __name__ == '__main__':
	shr.affecter_commande( "/stop", shr.stop_tp)
	shr.affecter_commande( "/", visualisation)
	shr.affecter_commande( "/autre", visualisation)
    
	shr.servir()

Paramètres supplémentaires

On peut de façon standard ajouter des paramètres à une requête web, en ajoutant un point d'interrogation «?» suivi de couples «clé=valeur» séparés par le caractère «&». Si on veut passer en paramètre la valeur «toto» au paramètre «nom» et la valeur «17» au paramètre «age», on ajoute donc «?nom=toto&age=17».

Ces paramètres sont passées dans «arg2» qui est un dictionnaire python. Leur usage sera expliqué au fur et à mesure des besoins.


import shr

def visualisation (arg1, arg2):
	print ('Arg2:', arg2)
	return "Bonjour !"

if __name__ == '__main__':
	shr.affecter_commande( "/stop", shr.stop_tp)
	shr.affecter_commande( "/", visualisation)
	shr.affecter_commande( "/autre", visualisation)

	print ("Tester avec :")
	print ("  127.0.0.1:5080/autre?nom=toto&age=17")
	print ("  127.0.0.1:5080/autre?pseudo=kiki01500&pays=france")
    
	shr.servir()
	
	print ("Fin du programme")

Interface du taquin

Nouveau module d'interface

Le but de cette partie est de remplacer le module d'interface créé en DM page un module «inteface_html.py» dont le squelette est donné ci-dessous.

La fonction «html_avec_cases» est à compléter sur le modèle de ce qui a été fait dans la séance sur les fichiers.

La fonction «mouvement» est à compléter par un appel vers la bonne fonction du module «fonctions.py» de façon à effectuer le mouvement demandé.



import fonctions
import shr

def html_avec_cases(cases):
	""" insère les cases dans un fichier html """


	# lecture du fichier source
	
	# on récupère les candidats

	#on génère le corps du tableau html

	# on l'insère dans le texte du fichier source et on renvoie le résultat sous forme de chaine de caractère
	
	return ""


def mouvement(commande, param):
	""" effectue le déplacement et affiche le résultat """

	global cases

	# pour échanger zéro avec la case (2,3) on aura mis en paramètre ?x=2&y=3
	# les lignes ci-dessous récupèrent cette information dans le doublet cible, il suffira d'ôter les «#»
	#x = int(param['x'])
	#y = int(param['y'])
	#cible = (x,y)

	# on effectue le mouvement
    
	# on renvoie le résultat
	return html_avec_cases(cases)

def depart(commande, param):
	""" renvoie la page html complétée avec le plateau initial """
	return html_avec_cases(cases)
    
if __name__ == '__main__':
	# on initialise le plateau
	cases = fonctions.mélanger(fonctions.gen_cases(4,4),3)

	# on affecte les 2 commandes
	shr.affecter_commande("/", depart)        # permière fenêtre
	shr.affecter_commande("/depl", mouvement) # action effectuée à chaque déplacement

	shr.affecter_commande("/stop", shr.stop_tp)   # on utilise la fonction stop_tp du module pour forcer l'arrêt

	# démarrage du serveur
	shr.servir()