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.
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" **).
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.
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.)
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
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.
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.
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.
Chapitre "Vous pourrez retourner" HTML généré dynamiquement ""
Recommended Posts