IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

[Tornado] problème de mise en cache de fichier statique


Sujet :

Réseau/Web Python

  1. #1
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut [Tornado] problème de mise en cache de fichier statique
    bonjour,

    alors voici un peu le contexte, j'utilise Tornado en tant que serveur web et framework web, le framework web me sert à construire un api, et avec Tornado je sert également des fichiers "statics" en faite il s'agit de fichier construit via webpack et avec une transcompilation babel pour pouvoir utiliser la syntaxe ES6 (j'utilise le framework VueJS)

    Le problème étant que ces fichiers statiques peuvent tout de même changer au court du temps (à chaque nouveau build, le résultat du build est dans le dossier dist) et voici le genre d'erreur que j'obtient coté Tornado
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    404 GET /js/chunk-vendors.f81239f6.js (192.168.43.243) 0.58ms
    404 GET /js/app.6b849377.js (192.168.43.243) 3.49ms
    ce qui est logique puisque Tornado me sert ça comme fichier index.html
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <!DOCTYPE html>
    <html lang=en>
        <head>
            <meta charset=utf-8>
            <meta http-equiv=X-UA-Compatible content="IE=edge">
            <meta name=viewport content="width=device-width,initial-scale=1">
            <link rel=icon href=/static/favicon.ico>
            <title>site</title>
            <link href=/css/app.ae36ad83.css rel=preload as=style>
            <link href=/js/app.6b849377.js rel=preload as=script>
            <link href=/js/chunk-vendors.f81239f6.js rel=preload as=script>
            <link href=/css/app.ae36ad83.css rel=stylesheet>
        </head>
        <body>
            <noscript>
                <strong>We're sorry but site doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
            </noscript>
            <div id=app></div>
            <script src=/js/chunk-vendors.f81239f6.js></script>
            <script src=/js/app.6b849377.js></script>
        </body>
    </html>
    or ce fichier là (index.html) n'existe plus, enfin les sources des scripts ont changées (devrait être src=/js/chunk-vendors.a4d141f7.js et src=/js/app.c5f62c85.js dans les sources du index.html)

    et du coup ... je me retrouve avec une page blanche

    voilà comment je sert tout ce beau monde:

    server.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import sys
    import asyncio
     
    import tornado.web
     
    import config
    from routes import routes
     
    if sys.platform == 'win32':
    	asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
     
     
    app = tornado.web.Application(routes)
     
    server = tornado.httpserver.HTTPServer(app)
    server.bind(8888)
    server.start(0)  # forks one process per cpu
     
     
    loop = asyncio.get_event_loop()
    loop.run_forever()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    routes.py
    import os
     
    import tornado.web
     
    import config
     
    from handler.test_handler import TestHandler
    from handler.vuejs_handler import VueJSRenderHandler
     
     
    routes = [
    	(r"/api/test", TestHandler),
    	(r'/js/(.*)', tornado.web.StaticFileHandler, {'path': os.path.join(config.DIST_PATH, "js", "")}),
    	(r'/css/(.*)', tornado.web.StaticFileHandler, {'path': os.path.join(config.DIST_PATH, "css", "")}),
    	(r'/img/(.*)', tornado.web.StaticFileHandler, {'path': os.path.join(config.DIST_PATH, "img", "")}),
    	(r'/static/(.*)', tornado.web.StaticFileHandler, {'path': os.path.join(config.DIST_PATH, "static", "")}),
    	(r"/.*", VueJSRenderHandler),
    ]
    vuejs_handler.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import os
     
    import tornado.web
     
    import config
     
    class VueJSRenderHandler(tornado.web.RequestHandler):
    	async def get(self):
    		self.render(os.path.join(config.DIST_PATH, "index.html"))
    voilà voilà
    la mise en cache ce fait bien coté Tornado, en vidant/désactivant le cache de mon navigateur j'ai le même problème, mais en relançant le serveur Tornado c'est tout bon.

    Je pourrais toujours gérer par moi même la mise en cache en stockant la date de création du dit fichier index.html et son contenu avec un bon vieux open (de toute façon on va pas se mentir à un moment où un autre Tornado doit bien le faire) mais ça évitera en plus tout le travail que fait Tornado (render fait plus que de servir un fichier statique)
    d'ailleurs le moyen le plus propre est sans doute d'utiliser un StaticFileHandler, mais comment fixer le fichier à rendre peut import l'url ? (en attendant des réponses je regarde voir les sources de StaticFileHandler afin de voir comment subclassé ça proprement)

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    Bonjour,

    J'ai l'impression que ce ne sont pas que les sources qui changent, mais aussi le nom des fichiers, et c'est bien pour cela que ton serveur ne les retrouvent pas...

    Avec Jinja, tu peux manipuler dans ton fichier index.html les fichiers dynamiquement, si tu as moyen de récupérer les noms de ces fichiers.

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    c'est pas un truc comme ça que tu cherches ?

  4. #4
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonjour,

    J'ai l'impression que ce ne sont pas que les sources qui changent, mais aussi le nom des fichiers, et c'est bien pour cela que ton serveur ne les retrouvent pas...

    Avec Jinja, tu peux manipuler dans ton fichier index.html les fichiers dynamiquement, si tu as moyen de récupérer les noms de ces fichiers.
    et bien se sont les noms des fichiers compilés qui changent et également le fichier index.html (pour qu'il soit en relation avec les nouveaux fichier JS) mais Tornado me sert une ancienne version de index.html qu'il a lui même mis en cache.

    Citation Envoyé par BufferBob Voir le message
    salut,

    c'est pas un truc comme ça que tu cherches ?
    non, la mise en cache se fait coté Tornado ici

    du coup j'ai essayé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (r"/.*()", tornado.web.StaticFileHandler, {'path': os.path.join(config.DIST_PATH, ""), "default_filename": "index.html"}),
    (j'ai également tenté r"/(.*)" en regex) dans mes routes à la place de mon VueJSRenderHandler, à la racine du site j'ai bien le fichier index.html qui est servi, mais par exemple /abc j'ai un 404, ce que j'aimerais c'est servir index.html peu importe l'url.

    et j'ai le même problème de mise en cache coté Tornado avec un StaticFileHandler, je pense donc que je vais opter pour ma 1ère idée (gérer ça moi même)

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    apparemment il y a une fonction auoreload.watch() pour scruter les changements sur un fichier et le cas échéant restart le process, ça peut peut-être servir.

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    Ma question est, est ce qu'il est possible de récupérer ces noms de fichier avant d'afficher à nouveau ta page d'index ?

  7. #7
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Ma question est, est ce qu'il est possible de récupérer ces noms de fichier avant d'afficher à nouveau ta page d'index ?
    Tout est possible, par contre ça voudrait dire ne plus utiliser le fichier index.html généré par webpack mais le construire moi même avec jinja, et ça je préfère éviter

    Citation Envoyé par BufferBob Voir le message
    apparemment il y a une fonction auoreload.watch() pour scruter les changements sur un fichier et le cas échéant restart le process, ça peut peut-être servir.
    en développement pourquoi pas mais à terme il y aura des websockets, des connexions à un DBB et peux être quelques autres trucs, d'autant que relancer un process alors qu'il pourrais potentiellement être en train de faire quelque chose je ne suis pas pour


    un moyen simple pour éviter un problème de cache est tout simplement ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class VueJSRenderHandler(tornado.web.RequestHandler):
    	async def get(self):
    		with open(os.path.join(config.DIST_PATH, "index.html")) as f:
    			self.write(f.read())
    bon ok c'est une solution à l'arrache
    gérer moi même la mise en cache coté Tornado se résumerait à soit faire un watch (ionotify ?) soit juste stocker os.path.getmtime et comparer si ça évolue, et gérer ma mise en cache comme ça
    mais je pense qu'il y a un moyen plus propre de faire ça avec Tornado mais je n'ai pas encore mis le doigt dessus

Discussions similaires

  1. [CS4][As2] problème de mise en cache sur IE
    Par FlashVert dans le forum Flash/Flex
    Réponses: 0
    Dernier message: 08/04/2009, 14h49
  2. [Zend_Cache] Problème de mise en cache indésirable
    Par Bebel dans le forum Zend Framework
    Réponses: 1
    Dernier message: 21/01/2008, 16h05
  3. Mise en cache des fichiers Js sur IE et FF
    Par seb0634 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 19/10/2007, 19h08
  4. Mise en cache de fichiers html php et css
    Par 12monkeys dans le forum Balisage (X)HTML et validation W3C
    Réponses: 29
    Dernier message: 06/07/2007, 09h51
  5. Google Gadget et problème de mise en cache
    Par nicolas.pied dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/07/2006, 10h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo