Mise à jour du chapitre "Autoriser plusieurs requêtes HTTP à répondre à plusieurs reprises" (https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python/viewer/daemonize) ..
Si vous voulez en savoir plus, veuillez "aimer" ou "me suivre" dans Book ;-)
Ce qui suit est un extrait du contenu du livre.
Il est temps de régler ce problème.
Les serveurs Web que vous avez créés jusqu'à présent seront arrêtés dès que vous traiterez une seule requête HTTP.
Par conséquent, vous devez redémarrer le serveur chaque fois que vous souhaitez répondre à des demandes répétées.
Il peut être ennuyeux de démarrer le serveur chaque fois que vous vérifiez l'opération pendant le développement, mais il y a aussi un problème d'affichage normal d'une page Web générale.
Par exemple, essayez de changer le index.html
créé dans le chapitre précédent comme suit.
study/static/index.html
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>HenaServer</title>
<link rel="stylesheet" href="index.css">
</head>
<body>
<img alt="logo" src="logo.png ">
<h1>Welcome to HenaServer!</h1>
</body>
</html>
https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter12/static/index.html
Ligne 6: <link rel =" styleheet "href =" index.css ">
Ligne 10: <img alt =" logo "src =" logo.png ">
Ajoutée.
Lecture de fichiers CSS externes communs et lecture de fichiers image.
Ensuite, préparez un nouveau fichier à lire dans le même répertoire.
Le contenu du fichier CSS est le suivant.
study/static/index.css
h1 {
color: red;
}
https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter12/static/index.css
Le fichier image est ici.
study/static/logo.png
https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter12/static/logo.png
Le fichier image peut être n'importe quoi, mais dans ce livre, il est emprunté à "Irasutoya" ^ [https://www.irasutoya.com/]. Vous pouvez utiliser n'importe quelle image que vous aimez.
Comme vous pouvez le voir, sur une page Web régulière, Chrome doit afficher l'image du logo et le texte doit être appliqué en CSS et affiché en rouge.
Maintenant, démarrons le serveur et accédons à http: // localhost: 8080 / index.html
dans Chrome.
Ce n'est pas bien. Aucune image ou CSS n'est chargé.
Lorsque le navigateur reçoit une réponse du serveur Web, il fait référence à un fichier externe dans le HTML du corps de la réponse (<img src =" ">
, <script src =" ">
, <link href =" ">
Etc.), il essaiera de récupérer le contenu du fichier en renvoyant la demande.
Cependant, notre serveur Web n'est pas en mesure de traiter les demandes supplémentaires (dans ce cas, les demandes CSS et d'image) car il met fin au programme immédiatement après le traitement de la première demande.
Regardons de plus près cette situation.
Chrome a une fonction appelée "Developer Tools" qui vous permet de voir les résultats de communication des requêtes HTTP en détail. Nous utiliserons cela pour vérifier l'état réel de la demande.
Sur l'écran où vous avez accédé plus tôt à http: // localhost: 8080 / index.html
dans Chrome, appuyez sur ctrl
+ shift
+ j
.
(Ou faites un clic droit sur l'écran et sélectionnez «Vérifier» pour ouvrir l'onglet «Console»)
Comme le montre la figure, lors de l'obtention de index.css
et logo.png
, ** un journal d'erreurs indiquant que la connexion avec le serveur Web a échoué s'affiche. ** **
(Chrome est également conçu pour qu'il soit difficile d'obtenir l'image de Fabicon sans aucune instruction, et cette erreur est également affichée, mais vous n'avez pas à vous en préoccuper dans ce livre. .)
Ensuite, ouvrez l'onglet Réseau
des outils de développement, * démarrez le serveur, puis * rechargez.
(L'onglet réseau doit être rechargé car il n'affiche que des informations pour les communications ultérieures après l'ouverture des outils de développement)
Vous pouvez voir que Chrome effectue un total de 4 communications pour afficher cette page. (Le contenu peut varier en fonction de la version et de l'environnement,)
En regardant la répartition, la communication pour obtenir index.html
a réussi ( status
est 200
), et index.css
et logo.png
ont échoué la communication (` status``) Vous pouvez voir que cela a échoué).
Il s'est avéré que ce n'est pas seulement "juste ennuyeux", mais qu'il n'est pas possible d'afficher ne serait-ce qu'une seule page Web ordinaire en utilisant CSS, images, JS, etc.
Améliorons maintenant notre serveur Web pour résoudre ces problèmes.
Premièrement, en mettant le processus d'établissement d'une connexion et de retour d'une réponse dans une boucle infinie, il est possible de répondre à des demandes répétées.
Le code source est ici.
study/WebServer.py
https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter12/WebServer.py
while True:
Le plus gros changement est que tout le processus de "attendre une connexion du client" à "terminer la connexion" (lignes 31-97) a été mis dans une boucle infinie. (Si vous ne comprenez pas la notation de la boucle infinie, veuillez vérifier avec "python while true".)
Il ne s'agit que d'une ligne, mais il termine le traitement d'une demande, ferme la connexion, puis revient au début de la boucle et attend à nouveau la demande. Lorsque le traitement de la requête suivante est terminé, il revient au début de la boucle et attend la requête suivante.
En d'autres termes, le programme continuera à traiter les demandes indéfiniment jusqu'à ce que la personne qui démarre le programme interrompt explicitement le programme.
except Exception:
#Si une exception se produit lors du traitement de la demande, un journal des erreurs est émis vers la console et
#continuer le traitement
print("Une erreur s'est produite lors du traitement de la demande.")
traceback.print_exc()
finally:
#La communication TCP est fermée, qu'une exception se produise ou non.
client_socket.close()
Au fait, j'ai ajouté la gestion des exceptions.
Si vous ne gérez pas les exceptions, l'ensemble du programme s'arrêtera si une exception se produit au milieu de la boucle, mais en gérant comme ci-dessus, seul le traitement de la requête en cours de traitement à ce moment sera interrompu, mais le programme Le tout ira à la boucle suivante sans s'arrêter.
De plus, close ()
of cient_socket
est fait dans la clause finally, pas à la fin de la clause try.
Si vous le faites à la fin de la clause try, la déconnexion de la connexion sera ignorée si une exception se produit au milieu.
Déplaçons-le réellement.
Démarrez le serveur depuis la console comme d'habitude.
Chapitre "Autoriser la réponse répétée à plusieurs requêtes HTTP"
Recommended Posts