Mise à jour de «Introduction à l'accueil de l'application Web Python pour les ingénieurs Web de 3e année qui sont lents»

Mise à jour du livre

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.


Le problème selon lequel le serveur Web ne peut traiter la demande qu'une seule fois

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.

Les fichiers externes ne peuvent pas être référencés à partir de HTML

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é).

Vous permet de gérer les demandes récurrentes

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.

Code source

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

Commentaire

30ème ligne

            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.

Lignes 89-97

                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.

Essayez de bouger

Déplaçons-le réellement.

Démarrez le serveur depuis la console comme d'habitude.


Continuez avec Book!

Chapitre "Autoriser la réponse répétée à plusieurs requêtes HTTP"

Recommended Posts

Mise à jour de «Introduction à l'accueil de l'application Web Python pour les ingénieurs Web de 3e année qui sont lents»
Mise à jour de «Introduction à l'accueil de l'application Web Python pour les ingénieurs Web de 3e année qui sont lents»
Mise à jour de «Introduction à l'accueil de l'application Web Python pour les ingénieurs Web de 3e année qui sont lents»
Mise à jour de «Introduction à l'accueil de l'application Web Python pour les ingénieurs Web de 3e année qui sont lents»
Mise à jour de «Introduction à l'accueil de l'application Web Python pour les ingénieurs Web de 3e année qui sont lents»
Mise à jour de «Introduction à l'accueil de l'application Web Python pour les ingénieurs Web de 3e année qui sont lents»
[Introduction à l'application Udemy Python3 +] 43. instruction for else
Introduction à Python pour, pendant
[Introduction à l'application Udemy Python3 +] 42. pour instruction, instruction break et instruction continue
[Présentation de l'application Udemy Python3 +] 58. Lambda
[Présentation de l'application Udemy Python3 +] 31. Commentaire
[Présentation de l'application Udemy Python3 +] 57. Décorateur
[Présentation de l'application Udemy Python3 +] 56. Clôture
[Présentation de l'application Udemy Python3 +] 59. Générateur
[Introduction à l'application Udemy Python3 +] Résumé
Premiers pas avec Python pour les non-ingénieurs
[Introduction à Udemy Python3 + Application] 18. Méthode List
[Introduction à Udemy Python3 + Application] 63. Notation d'inclusion du générateur
[Introduction à Udemy Python3 + Application] 25. Méthode de type dictionnaire
[Introduction à l'application Udemy Python3 +] 33. instruction if
[Introduction à Udemy Python3 + Application] 13. Méthode de caractères
[Introduction à l'application Udemy Python3 +] 55. Fonctions intégrées
[Introduction à l'application Udemy Python3 +] 48. Définition des fonctions
[Introduction à l'application Udemy Python3 +] 10. Valeur numérique
[Introduction à l'application Udemy Python3 +] 41. fonction d'entrée
[Introduction à l'application Udemy Python3 +] 17. Opération de liste
[Introduction à l'application Udemy Python3 +] 11. Chaîne de caractères
[Introduction à l'application Udemy Python3 +] 44. fonction range
[Introduction à l'application Udemy Python3 +] 46. fonction zip
[Introduction à l'application Udemy Python3 +] 24. Type de dictionnaire
[Python] Conception d'applications Web pour l'apprentissage automatique
Une introduction à Python pour l'apprentissage automatique
[Introduction à Udemy Python3 + Application] 8. Déclaration de variable
[Introduction à Udemy Python3 + Application] 29. Méthode Set
[Introduction à l'application Udemy Python3 +] 16. Type de liste
[Introduction à Udemy Python3 + Application] 61. Notation d'inclusion de dictionnaire
[Introduction à l'application Udemy Python3 +] 22. Déballage de taples
Une introduction à Python pour les programmeurs en langage C
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for
Prenons la version gratuite "Introduction à Python pour l'apprentissage automatique" en ligne jusqu'au 27/04
Explication facile à comprendre de l'application Web Python (Django) même pour les débutants (4) [Route setting / Introduction to MTV design patterns]
Mis à jour vers Python 2.7.9
[Introduction à Udemy Python3 + Application] 26. Copie du dictionnaire
[Introduction à l'application Udemy Python3 +] 23. Comment utiliser Tapuru
[Introduction à Udemy Python3 + Application] 60. Notation d'inclusion de liste
[Introduction à Udemy Python3 + Application] 19. Copie de la liste
[Introduction à Udemy Python3 + Application] 38. Lors du jugement Aucun
[Introduction à Udemy Python3 + Application] 62. Définir la notation d'inclusion
Étapes pour développer une application Web en Python
[Introduction à l'application Udemy Python3 +] 64. Espace de noms et portée
[Introduction à Udemy Python3 + Application] 67. Arguments de ligne de commande
Introduction à la programmation (Python) TA Tendency pour les débutants
[Introduction à l'application Udemy Python3 +] 54. Qu'est-ce que Docstrings?
[Introduction à Udemy Python3 + Application] 37. Technique pour juger qu'il n'y a pas de valeur
[Introduction à Udemy Python3 + Application] 14. Substitution de caractères 15.f-strings
Comprendre le développement de Python pour Pepper. -Introduction à Python Box-
[Introduction à l'application Udemy Python3 +] 35. Opérateurs de comparaison et opérateurs logiques
[Introduction à l'application Udemy Python3 +] 66. Création de votre propre exception
(Python) Essayez de développer une application Web en utilisant Django
[Introduction à python] Introduction rapide à Python pour les programmeurs C ++ occupés
[Introduction à Udemy Python3 + Application] 53. Dictionnaire des arguments de mots-clés