Une application web avec Word et le module Bottle de Python

Par un débutant

Le problème exposé dans ce sujet a été résolu.

Bonjour

Je veux créer mon propre site internet, de toutes pièces, donc en réinventant la roue ! Je veux en effet un design identique à celui que permet le traitement de texte, en utilisant donc la facilité que donne Word par exemple pour mettre en italique, insérer une image, choisir une police et sa taille, etc. Je vais donc utiliser la conversion sous format HTML que permet Word. (j’ai du matériel ancien, mac OS X Capitan, Word pour mac 16.16.27). Et un réseau de douze machines entre 2005 et 2010, pour une salle de classe.

Je vais utiliser le module Bottle de Python, bien que mon application ne soit pas destinée uniquement au local. Il est en effet possible de coupler le projet Bottle avec un serveur plus sérieux (tout cela est fort bien expliqué dans la doc Python.)

Je vous rejoins pour deux raisons : primo, comme je l’ai dit, je suis débutant, j’ai donc besoin qu’on m’aide. Secundo, comme on a ici la possibilité de présenter son projet, les étapes de ma progression pourront servir à d’autres. Et j’ai quand-même des connaissances et des savoir-faire, donc je peux me rendre utile aussi de cette façon-là.

J’en suis vraiment au tout-début ! Je viens de finir de me traduire la doc Bottle, j’ai un menu provisoire, et des textes de différentes rubriques. La première étape sera de mettre en ligne ce corpus. Puis je créerai une petite base de données, limitée aux pseudos des membres : pour voir, sans se soucier de sécurité. Et quand je saurai protéger efficacement mes données, je pourrai demander un mail à mes abonnés. Je suppose que je pourrai continuer avec le serveur natif de Bottle un certain temps : le jour où ça plantera, ça voudra dire que j’ai du succès !

Voici mon premier problème

Je cherche à afficher un fichier statique, image, HTML, CSS. J’ai commencé par une image, un jpg. Voici le code :

@route('/static/<filepath:path>')
def send_image(filepath):
    return static_file(filepath, root='', mimetype='image/jpg')
    
run(host='localhost', port=8080, debug=True)

Ça marche moyennement, mais c’est peut-être normal. L’image est téléchargée.Je suppose que pour l’avoir par le navigateur, il faut l’insérer dans une page HTML.

Mais pour un fichier HTML, ou TXT, ou RTF, ça ne marche pas.

@route('/static/<filepath:path>')
def send_image(filepath):
    return static_file(filepath, root='', mimetype='text/html')
    

run(host='localhost', port=8080, debug=True)

C’est le même code sauf le type de fichier.Il ne trouve jamais. Je pige pas : dans 'static’, j’ai un 'textes’ et un 'images’, et je fais bien la bonne requête.

Voila. Merci de m’avoir lu !

+0 -0

Non, ce n’est pas facile, si j’ai bien compris ton projet.

Tu peux tout à fait éditer ton message, c’est en haut à droite pour le faire. Tu as le lien en-dessous de l’éditeur de message pour avoir toutes les infos sur comment bien formater ce qu’on écrit.

+0 -0

Ça y est j’ai vu ! Oui, en effet, c’est pas facile, en tout cas pour moi. C’est la raison pour laquelle je viens chercher de l’aide ! Pour ce qui est des projets libres similaires, je doute qu’il existe ce dont j’ai exactement besoin (je n’ai pas dit ce que j’entreprendrai une fois les premières étapes franchies).

+0 -0

Salut,

Tu dis que bottle ne trouve pas le fichier, mais est-ce que tu peux donner plus de détails ?
J’ai essayé chez moi de reproduire quelque chose d’équivalent et ça fonctionne bien : le fichier HTML est correctement servi par le serveur web.

Est-ce que tu pourrais alors préciser où tu stockes tes fichiers et comment tu lances ton programme ?

Voici pour information mon test qui se lance correctement.

Exemple
from bottle import route, run, static_file

@route('/static/<filepath:path>')
def send_static(filepath):
    return static_file(filepath, root='', mimetype='text/html')

run(host='localhost', port=8080)
app.py
<html>
  <body>
    <p>Test !</p>
  </body>
</html>
toto.html
% python app.py
Bottle v0.12.19 server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

127.0.0.1 - - [21/Feb/2022 12:28:33] "GET /static/toto.html HTTP/1.1" 200 52
Lancement du programme

Et donc si je me rends sur http://localhost:8080/static/toto.html j’accède bien à ma page HTML statique.

Par contre, je te déconseille d’utiliser Word pour créer tes fichiers HTML, ce n’est pas vraiment adapté et ça aura tendance à te rendre des pages lourdes et qui ne s’afficheront pas très bien sur les différents navigateurs.

Bonjour Entwanne, et pardon pour le retard. Je suis revenu voir pendant quelques jours, puis je me suis lassé. Il faudrait que je voie si on peut mettre une alerte. Merci pour ton petit code. Je vais l’essayer. Entre temps, j’ai fait d’autres choses, révisé sql par exemple, lu, écrit, traduit des docs, + réparé motos et vélos. Et là ma base de données est à peu près prête, elle contiendra notamment les url des fichiers statics. Donc c’est le bon moment de revenir à ces fichiers statiques.

J’ai essayé ton code, ça ne va pas non plus. Je me demande si j’ai bien tout compris en ce qui concerne la racine. 'root’, pour moi, ça veut dire le dossier dans lequel se trouve app.py. J’ai bon ? J’y ai bien créé un dossier "static", dans lequel j’ai mis toto.html. Et j’ai un beau 404.Pareil que le mois dernier quand j’ai créé ce sujet.

En tout cas, j’ai mis l’alerte, si quelqu’un me répond, cette fois-ci, je viendrai tout de suite.

Bonjour Ça y est, j’y suis arrivé ! Tout est de ma faute ! root = 'static' figurait bien dans le tuto de l’ENSI, un des tuto avec lesquels je travaille. Voici le code qui fonctionne (En commentaire, j’ai noté le premier succès obtenu en mettant la page statique en racine.) Comme en histoire des maths, les errements sont profitables ! J’ai trouvé un fil très utile sur stackoverflow, qui me donne un aperçu de ce qui m’attend quand j’en serai au déploiement.

J’ai une autre question : après avoir réussi en mettant la page en racine, j’ai modifié cette page, pour savoir si c’était celle qui se trouve en racine ou celle qui se trouve dans static qui était chargée. Pour ce fair, j’ai remplacé le texte 'test !' par 'en racine' et 'dans static’. Or, la page qui venait avait tpujours le texte 'test !’. J’ai quitté firefox, revenu dedans, plusieurs fois, j’ai rafraichi la page, mais rien n’y fait. Une ou deux heures plus tard, Firefox me ramène toujours cette page fantôme ! J’ai dû prendre Chrome. À quoic’est dû, et comment réactualiser la page html pour éviter ça ?

#marche : root='.' ou '', route('<filepath:path>'), requête : 8080:toto.html
@route('/static/<filepath:path>')
def send_static(filepath):
    return static_file(filepath, root='static', mimetype='text/html')

run(host='localhost', port=8080)

Je ne suis pas sûr de comprendre ce que tu as fait / cherches à faire, est-ce que tu pourrais montrer le code dans un cas et dans l’autre ?

Aussi est-ce que tu as bien pensé à redémarrer le serveur entre tes changements ?

Oui, j’ai bien compris ça, par contre ! Une modification dans le code python, et il faut arrêter et redémarrer le serveur. Qu’est ce que tu appelles "dans un cas et dans l’autre ?" Tu parles de mon essai de mettre la page en racine ? Donc là, les deux codes sont les mêmes, hormis ce qui est inscrit en commentaire (marche : …). En fait, c’est d’avoir eu l’idée de regarder ce qui se passerait si je mettais la page en racine qui m’a boosté ! De voir que ça marchait m’a remonté le moral, et c’est ensuite que j’ai tout regardé attentivement, et vu le " root = 'static' ". Sinon, firefox a enfin accepté d’oublier la page html décédée.

Le projet avance ! Mes pages HTML écrites par Word s’affichent. Mais je rencontre un problème dans le cas où la page contient des images.

Voici le code : Maintenant que j’ai pigé comment on éditait, et vu que j’ai compris que mon problème ne venait pas de la conversion Word —> HTML, j’efface ce post. Voyez plutôt le suivant.

Edit Arius : mise en forme du code

+0 -0

En fait, ce n’est pas dû au fait que le template inclue une page convertie par Word. Si on essaye simplement d’afficher une photo insérée dans le template, ça ne marche pas non plus.

from bottle import route, run, view

@route("/")
@view("pagedegarde.html")
def menu() :
	contenu = "Moto de l'abbé Khan"
	return {"titre" : "Bécanes", "contenu" : contenu}

run(host = '0.0.0.0', port  = 8080, debug = True, reloader = True)

Voici le template :

<!doctype html>
<!-- page_de_garde.tpl -->
<HTML lang="fr">
  <HEAD>
     <TITLE>{{titre}}</TITLE>
     <meta charset="UTF-8">
     <link rel="icon" href="favicon.jpg" >
  </HEAD>

  <body>
    <header>
    <h1>Phrassses et attrapes</h1>
    </header>
    <h3>{{titre}}</h3>
    <p><image src="turquoise.jpg" alt="125 k4" /></p>
    <!--si on met pas le / avant "turquoise", 746 ; si on le met, 742.-->
    {{!contenu}}
    <hr/>
  </body>
</html>

(j’ai ajouté le favicon entre temps. Lui non plus ne vient pas. Et si on clique sur le fichier html, tout marche (sauf les titre et contenu qui ne sont pas renseignés, bien sûr, et il vient {{titre}} et {{contenu}} à la place.

+0 -0

Quand tu dis « ça marche pas » tu peux être plus précis ? La page HTML s’affiche mais pas l’image, c’est ça ?

As-tu essayé de te rendre directement sur l’adresse de l’image (http://localhost:8080/turquoise.jpg) et qu’est-ce que tu obtiens ?
Est-ce que tu as une route statique prévue pour servir ces fichiers image ?

Bonjour Entwanne. J’ai réussi à afficher mon image. Grâce à divers contributeurs sur divers forums. (OC, SO). Juste une route supplémentaire pour les images, et les fichiers statiques en général. Mezrci tout de même pour ton zeste d’aide.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte