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

Chapitre "Vous pourrez retourner" HTML généré dynamiquement "" Le a été mis à jour.

Si vous voulez en savoir plus, veuillez "aimer" ou "me suivre" dans Book ;-)


Ce qui suit est un extrait du contenu du livre.


"Livraison de fichier statique" et "Génération HTML dynamique"

Désormais, vous pouvez "générer des en-têtes appropriés" (Date, Content-Type, etc.), "traitement parallèle", et retourner une réponse selon les règles HTTP. La partie est assez bien organisée.

C'est presque la fin de l'étape ** "Nous allons préparer les fonctions minimales en tant que serveur Web (= serveur HTTP)" **.

Comme étape suivante, examinons de plus près ** "Que renvoyer comme corps de réponse?" **.


La fonction déjà implémentée de "renvoyer le contenu d'un fichier HTML ou d'un fichier image tel quel en tant que corps de réponse" est généralement appelée ** "livraison de fichier statique" **.

Avec cette fonctionnalité, vous pouvez créer, par exemple, RFC Web Page by IETF. Tout ce que vous avez à faire est d'écrire le contenu dans un fichier HTML et de l'enregistrer.

Cependant, il manque toujours des fonctionnalités pour créer une page d'accueil que vous connaissez bien.

Par exemple, Page d'accueil du professeur Maebashi ^ [Je suis l'auteur de "Introduction au développement d'applications Web à partir des bases de l'apprentissage tout en créant un serveur Web" qui m'a donné l'opportunité d'écrire ce livre. Pour plus d'informations, c'est relativement simple comme ici] ^ [Désolé, professeur Maebashi. ] Je ne peux même pas encore créer de page d’accueil.

Ce que l'on ne peut pas faire, c'est la partie dite "compteur d'accès" comme illustré ci-dessous.

Le nombre sur le compteur d'accès augmente à mesure que vous chargez la page. Comment pouvez-vous réaliser cette fonctionnalité sur votre serveur Web actuel?

Lorsque le numéro du compteur d'accès change, cela signifie que le contenu du corps de la réponse change. Le corps de la réponse renvoyé par le serveur Web actuel est le même que le contenu du fichier HTML. Par conséquent, si vous souhaitez modifier le contenu du corps de la réponse, vous devez modifier le fichier HTML.

En d'autres termes, si vous souhaitez fournir cette fonction, vous avez besoin d'une fonction pour éditer et enregistrer automatiquement (ou manuellement) le fichier HTML à chaque fois qu'une requête HTTP arrive. Cela semble trop inefficace (bien que faisable) et ennuyeux.

Quand cela arrive, ** "N'est-il pas facile de générer un corps de réponse différent à chaque fois si vous le générez sous forme de chaîne Python au lieu d'obtenir le corps de réponse d'un fichier?" ** Il serait naturel de penser cela.

Cela s'appelle ** "Dynamic HTML Generation" ** (ou ** "Dynamic Response Generation" **).

Colonnes: "Statique" et "Dynamique"

Le mot «statique» est assez ennuyeux. De plus, le synonyme "dynamique" est tout aussi ennuyeux.

«Statique» signifie «choses qui ne changent pas» et «dynamique» signifie «choses qui changent», mais «** qu'est-ce qui est statique ** pour quoi» et «** quoi D'autre part, vous devez toujours être conscient de ce qui est dynamique **.


Par exemple, "" livraison du fichier statique "signifie" livraison du "fichier inchangé" ". Qu'est-ce que c'est un fichier qui ne change pas ** pour quoi?

Le fichier HTML lui-même peut changer à tout moment. Modifiez simplement le fichier avec un éditeur. Même lorsqu'il est considéré comme une fonction du serveur Web, le corps de la réponse change si vous modifiez le fichier HTML.

Certaines personnes décrivent la «livraison de fichiers statiques» comme «un service Web qui renvoie« toujours »la même réponse», mais cela la rend inexacte. Si vous modifiez le fichier HTML, la réponse changera.

La réponse est "** Livraison de fichiers dont le contenu ne change pas en réponse aux demandes". Il peut être plus facile de dire «livrer un fichier qui ne change pas son contenu sur demande».

Ainsi, lorsque vous modifiez un fichier, le contenu peut changer.

Quand j'étais ingénieur junior "Mais si vous modifiez le fichier HTML, la réponse changera, n'est-ce pas toujours la même?" J'étais confus.


De plus, lors de la description de Javascript, il est parfois décrit comme «un langage de programmation pour fournir du contenu dynamique sur le Web». "Contenu dynamique" dans cette description signifie "contenu qui ** change le HTML livré ** avec le passage du temps ou l'interaction de l'utilisateur" ^ [Pour être exact, Javascript le change. C'est du DOM, pas du HTML, mais c'est mignon. ].

Une fois que le HTML à afficher sur le navigateur est envoyé au navigateur en tant que réponse, il est fondamentalement impossible de le modifier à partir du programme côté serveur. CSS etc. modifie le contenu d'affichage du contenu (rend le texte de couleur rouge), mais il ne change pas le contenu du HTML livré.

Cependant, si vous envoyez le programme au navigateur avec le HTML, le navigateur peut exécuter le programme ultérieurement pour modifier le HTML livré. C'est Javascript.

Si vous comprenez simplement "contenu dynamique" comme "modification d'une page Web", "Le CSS qui change la couleur du texte ne fournit-il pas également un contenu dynamique?" "La balise de formulaire HTML est également dynamique car le comportement de la page change selon que le bouton est enfoncé ou non." Ce sera déroutant. (J'étais confus.)


Comme vous pouvez le voir, les mots «statique» et «dynamique» sont souvent utilisés, mais ils sont difficiles à comprendre, alors faites toujours attention à ce qui change / ne change pas.

Créer une page qui affiche l'heure actuelle

Je l'ai expliqué un peu détourné, mais il peut être plus rapide de jeter un œil au code source de ce que vous voulez faire.

Effectuons en fait une "génération HTML dynamique" et créons une page dont le résultat change à chaque fois que vous le demandez.

Pour implémenter soudainement le compteur d'accès, vous avez besoin de quelque chose comme une base de données qui stocke le nombre d'accès passés, ce qui est un peu gênant, donc par souci de simplicité, accédez d'abord au chemin ** / now pour afficher l'heure actuelle. Créons une page qui ne **.

(Je travaillerai sur l'implémentation du compteur d'accès un peu plus tard.)

Code source

Voici le code source qui a modifié workerthread.py pour ajouter une page qui affiche l'heure actuelle.

study/workerthread.py https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter14/workerthread.py

Commentaire

Lignes 42-59

            response_body: bytes
            response_line: str
            #le chemin est/Quand maintenant, générez du HTML qui affiche l'heure actuelle
            if path == "/now":
                html = f"""\
                    <html>
                    <body>
                        <h1>Now: {datetime.now()}</h1>
                    </body>
                    </html>
                """
                response_body = textwrap.dedent(html).encode()

                #Générer une ligne de réponse
                response_line = "HTTP/1.1 200 OK\r\n"

            #Dans le cas contraire, générer une réponse à partir d'un fichier statique
            else:
                # ...

C'est la partie que j'ai ajoutée.

Que fais tu ** "Si le chemin est / maintenant, générez du HTML qui affiche l'heure actuelle avec python et utilisez-le comme corps de réponse" ** à propos de ça.


Voici quelques suppléments sur le code source.

            response_body: bytes
            response_line: str

Étant donné que l'emplacement de remplacement de «response_body» et «response_line» est divisé en plusieurs parties, j'ai décidé de faire une annotation de type à l'avance.

L'annotation de type variable a le sens de donner un indice aux éditeurs, etc., "Cette variable est censée attribuer une valeur de ce type." Si vous l'écrivez ainsi, l'éditeur vous avertira à l'avance si vous dites par erreur "substitute str là-bas, remplacez" bytes` ici ".

                html = f"""\
                    <html>
                    <body>
                        <h1>Now: {datetime.now()}</h1>
                    </body>
                    </html>
                """
                response_body = textwrap.dedent(html).encode()

J'utilise here document +dedent (). Je veux juste écrire du html ordinaire, mais les retraits et les sauts de ligne ont un sens en python, donc je le conçois. Ce n'est pas si difficile, alors vérifiez-le dans "python here document", "python dedent", etc.

Essayez de bouger

Déplaçons-le maintenant.

Après avoir démarré le serveur comme d'habitude, essayez d'accéder à http: // localhost: 8080 / now dans Chrome.

C'est simple, mais avez-vous vu une page comme celle ci-dessus?

Si vous le voyez, essayez de recharger la page plusieurs fois. Le contenu affiché change-t-il à chaque fois?


Ceci termine la génération HTML dynamique. C'était facile.

Avec le recul, le point important de ce que j'ai fait cette fois est ** "Après le démarrage du serveur, je n'ai pas du tout modifié le code source ou le fichier HTML, mais le résultat est différent à chaque fois" ** à propos de ça.

Il s'agit d'une fonction qui n'a pas pu être réalisée en sortant simplement le contenu du fichier en tant que corps de réponse.

Créer une page pour afficher le contenu de la requête HTTP

Comme c'est un gros problème, créons une autre page HTML dynamique.

Ensuite, ajoutons une page appelée / show_request qui affiche le contenu de la requête HTTP envoyée telle qu'elle est en HTML.


Continuez avec Book!

Chapitre "Vous pourrez retourner" HTML généré dynamiquement ""

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»
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
Explication facile à comprendre de l'application Web Python (Django) même pour les débutants (5) [Introduction au fonctionnement de la base de données avec le shell Django]
[Introduction à Udemy Python3 + Application] 63. Notation d'inclusion du générateur
[Introduction à l'application Udemy Python3 +] 28. Type collectif
[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 +] 21. Type Taple
[Introduction à l'application Udemy Python3 +] 45. fonction enumerate
[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 +] 65. Gestion des exceptions
[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
Une introduction aux applications Web Python auto-conçues pour un ingénieur Web de troisième année paresseux
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 à Tornado (1): Framework Web Python démarré avec Tornado
[Introduction à l'application Udemy Python3 +] 40. Instruction while else
[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 à Python3 Jour 20] Chapitre 9 Démêler le Web (9.1-9.4)
[Introduction à Udemy Python3 + Application] 67. Arguments de ligne de commande
[Introduction à l'application Udemy Python3 +] 9. Tout d'abord, imprimez avec print