Django won't refresh staticfiles

前端 未结 15 1079
渐次进展
渐次进展 2020-12-07 18:31

This is annoying. I have a javascript file referenced on a django template:

 
相关标签:
15条回答
  • 2020-12-07 18:57

    I have also struggled with this problem for hours. I have tried to inject random string using Javascript, but this method seems stupid and ugly-looking. One possible way to handle this problem is to introduce a custom tag. See this document for details:

    Specifically, you need to create a package called templatetags in whatever apps you have created (or create a new one if you want). And you create any file in this package, and write something like this:

    from django import template
    from django.utils.crypto import get_random_string
    from django.templatetags import static
    
    register = template.Library()
    
    
    class StaticExtraNode(static.StaticNode):
    
        def render(self, context):
            return super().render(context) + '?v=' + get_random_string(32)
    
    
    @register.tag('static_no_cache')
    def do_static_extra(parser, token):
        return StaticExtraNode.handle_token(parser, token)
    
    
    def static_extra(path):
        return StaticExtraNode.handle_simple(path)
    

    then you can use tag {% static_no_cache '.../.../path...' %} to create a path with random arguments!

    I hope this would help!

    0 讨论(0)
  • 2020-12-07 18:58

    If nothing else works, search for the file name in the project and look for an unexpected copy. If you saved to the wrong location (different app) at some point, or splintered off a new app from an old, load priority may be playing tricks on you.

    0 讨论(0)
  • 2020-12-07 19:01

    A simple way to get rid, do a hard refresh cmd+shift+r/ctr+shift+r

    A hard refresh is a way of clearing the browser’s cache for a specific page, to force it to load the most recent version of a page. on browser cmd+shift+r/ctr+shift+r

    0 讨论(0)
  • 2020-12-07 19:03

    Your browser will cache images and files (javascript included). First, clear just your cached images and files. Then use incognito mode in chrome or private browsing in firefox while you are making changes to your .js files so you see them instantly after a page refresh

    0 讨论(0)
  • 2020-12-07 19:04

    For me after re collecting the static files Just Changes reflected for me.

    $ python manage.py collectstatic --noinput --clear
    

    Now run your server, hope it works.

    $ python manage.py runserver
    
    0 讨论(0)
  • 2020-12-07 19:05

    If you don't want to refresh the browser cache each time you change your CSS and JavaScript files, or while styling images, you need to set STATIC_URLdynamically with a varying path component. With the dynamically changing URL, whenever the code is updated, the visitor's browser will force loading of all-new uncached static files. In this recipe, we will set a dynamic path for STATIC_URL using time of last edit in os.

    import os
    from datetime import datetime    
    
    def get_file_changeset(absolute_path):
        timestamp = max(map(lambda x: os.path.getmtime(x[0]), os.walk(os.path.join(absolute_path, 'static'))))
        try:
            timestamp = datetime.utcfromtimestamp(int(timestamp))
        except ValueError:
            return ""
        changeset = timestamp.strftime('%Y%m%d%H%M%S')
        return changeset
    

    And next change in your SETTINGS:

    from utils.misc import get_file_changeset
    STATIC_URL = "/static/%s/" % get_file_changeset(BASE_DIR)
    

    How it works:
    The get_file_changeset()function takes the absolute_path directory as a parameter and calls the os.path.getmtime() to each file in each nested directory and finds the last-edited file (with its max edit time). The timestamp is parsed; converted to a string consisting of year, month, day, hour, minutes, and seconds; returned; and included in the definition of STATIC_URL.

    Note: With this you have to reload dev server each time when you edit your static files.

    0 讨论(0)
提交回复
热议问题