Un serveur écrit en Python reçoit la chaîne de requête suivante
Exercice supplémentaire · niveau 2 · NSI (première), chapitre 10 — Interagir sur le Web · Le serveur, de plus près
Énoncé
Un serveur écrit en Python reçoit la chaîne de requête suivante :
chaine = "q=chat+noir&occasion=oui&tri=date&genre=policier&genre=BD"
- Que renvoie
parse_qs(chaine)du moduleurllib.parse? Écrire le résultat exact. - Pourquoi les valeurs sont-elles des listes ?
- Écrire la fonction inverse : produire la chaîne à partir d'un dictionnaire.
Corrigé
1.
from urllib.parse import parse_qs
chaine = "q=chat+noir&occasion=oui&tri=date&genre=policier&genre=BD"
print(parse_qs(chaine))
# {'q': ['chat noir'], 'occasion': ['oui'], 'tri': ['date'],
# 'genre': ['policier', 'BD']}
Le + est redevenu un espace au passage : c'est le décodage inverse de celui qu'a fait le navigateur.
2. Parce qu'un même nom peut apparaître plusieurs fois. C'est le cas normal d'un groupe de cases à cocher partageant le même name, ou d'une liste à choix multiples. Le format ne dit nulle part qu'un nom est unique ; parse_qs ne peut donc pas promettre une valeur unique, et rend systématiquement une liste.
Ce qui en découle, et c'est le vrai sujet : un serveur qui écrirait ville = donnees["ville"] obtient ['Nantes'] et non 'Nantes'. Pire, un utilisateur qui envoie deux fois le même paramètre — ?role=eleve&role=admin — obtient une liste de deux valeurs, et le programme qui prend « la dernière » ou « la première » sans y penser peut se faire surprendre. C'est un cas classique de la règle du cours : le serveur ne fait jamais confiance à ce que le client lui envoie, pas même à sa forme.
3.
from urllib.parse import urlencode
parametres = {"q": "chat noir", "genre": ["policier", "BD"]}
print(urlencode(parametres, doseq=True))
# q=chat+noir&genre=policier&genre=BD
Sans doseq=True, la liste serait écrite telle quelle, crochets compris, et le serveur d'en face ne saurait pas la relire.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.