Adloun

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"

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.