tag - django templates examples
Django no actualizará archivos estáticos (9)
En lugar de utilizar soluciones complicadas, puede agregar un parámetro adicional a su inclusión en las plantillas.
Para estática incluye:
<script src="{% static ''js/polls/polls.js'' %}?version=1"></script>
Para directos incluye:
<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?version=1" />
Tenga en cuenta la ?version=1
en el código. Cada vez que modifique el archivo css / js, cambie esta versión en la plantilla, de modo que el navegador se verá obligado a volver a cargar el archivo.
Y si desea evitar el almacenamiento en caché por alguna razón desconocida, puede usar la marca de tiempo actual en lugar de la versión:
<link rel="stylesheet" type="text/css" href="/site_media/css/style.css?{% now "U" %}" />
Esto es molesto. Tengo un archivo javascript referenciado en una plantilla de django:
<script src="{% static ''js/login.js'' %} "></script>
Hice algunos cambios en ese archivo js. Luego, actualizo la página y no puedo ver los cambios que ocurren.
Si quito el javascript del archivo y lo puse en el HTML, funciona correctamente, pero si intento hacerlo usando el archivo js externo, no lo hace. He intentado cerrar el servidor y ejecutar runserver varias veces, también he intentado cambiar de Firefox a Chrome. No tiene ningún sentido. Por favor, ayúdame a entender, puedo evitar incluir todos los js dentro del HTML, pero me molesta que ya no pueda hacerlo de la manera habitual.
Más detalles sobre este error (la cosa más extraña que he encontrado en # $ y% #):
El javascript es algo como esto:
old_sentence = "Dig that hole, forget the sun" // this is what I want to change
$("#jqselector").text(old_sentence)
new_sentence = "Run, rabbit, run" // this is the new sentence, it just won''t show up.
Entonces, cambié el js y reinicié el servidor, aún el html muestra la oración anterior. Luego borré la referencia al archivo login.js y puse todas las js dentro de las etiquetas de script en el HTML, por supuesto, aparece la nueva oración. Luego incluyo el archivo login.js, comente el js dentro del html PERO elimino todo el contenido dentro del archivo login.js, convirtiéndolo en un archivo vacío ... pero la frase anterior sigue apareciendo. Por lo tanto, el antiguo archivo login.js debe ser cobrado en un lugar que no sé. Luego abro Chrome y lo intento de nuevo, el mismo problema.
¿Qué puede ser? ¿Existe una opción para forzar a django a actualizar archivos estáticos? Pensé que reiniciar el servidor era suficiente. .. ¿Debo reiniciar mi computadora? : / lol.
Necesitas romper el caché del navegador. Esta etiqueta de plantilla generará un uuid basado en el tiempo cuando DEBUG=True
. De lo contrario, buscará una variable de entorno PROJECT_VERSION
. Si no se encuentra, generará un número de versión estática.
from django import template
from django.conf import settings
register = template.Library()
@register.simple_tag(name=''cache_bust'')
def cache_bust():
if settings.DEBUG:
version = uuid.uuid1()
else:
version = os.environ.get(''PROJECT_VERSION'')
if version is None:
version = ''1''
return ''__v__={version}''.format(version=version)
Usted usaría en una plantilla como esta:
{% load cache_bust %}
<link rel="stylesheet" href="{% static "css/project.css" %}?{% cache_bust %}"/>
Y aquí está la salida resultante:
<link rel="stylesheet" href="/static/css/project.css?__v__=7d88de4e-7258-11e7-95a7-0242ac130005"/>
Para actualizar los archivos estáticos, debe ejecutar python manage.py collectstatic
nuevo.
Parece que ambos navegadores tienen el archivo javascript en caché. En Chrome puede borrar el caché presionando Ctrl
+ Shift
+ Del
y marcando ''Imágenes y archivos en caché''. Firefox probablemente tiene un atajo similar.
Puede consultar esta pregunta en sugerencias para desactivar el almacenamiento en caché de archivos estáticos en su servidor de desarrollo por completo.
Si nada más funciona, busque el nombre del archivo en el proyecto y busque una copia inesperada. Si guardó en una ubicación incorrecta (aplicación diferente) en algún momento, o si se separó de una aplicación nueva de una antigua, la prioridad de carga puede estar jugando con usted.
Si no desea actualizar la memoria caché del navegador cada vez que cambia sus archivos CSS y JavaScript, o mientras estiliza las imágenes, debe configurar STATIC_URL
dinámicamente con un componente de ruta variable. Con la URL que cambia dinámicamente, cada vez que se actualiza el código, el navegador del visitante forzará la carga de nuevos archivos estáticos no almacenados en caché. En esta receta, estableceremos una ruta dinámica para STATIC_URL
usando el tiempo de la última edición en 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
Y el próximo cambio en tus SETTINGS
:
from utils.misc import get_file_changeset
STATIC_URL = "/static/%s/" % get_file_changeset(BASE_DIR)
Cómo funciona:
La función get_file_changeset()
toma el directorio absolute_path
como un parámetro y llama a os.path.getmtime()
a cada archivo en cada directorio anidado y encuentra el último archivo editado (con su tiempo de edición máximo). La marca de tiempo se analiza; convertido en una cadena que consta de año, mes, día, hora, minutos y segundos; devuelto e incluido en la definición de STATIC_URL
.
Nota: con esto tienes que volver a cargar el servidor dev cada vez que edites tus archivos estáticos.
Su navegador almacenará imágenes y archivos en caché (incluido javascript). Primero, borre solo sus imágenes y archivos en caché. Luego use el modo de incógnito en chrome o la navegación privada en Firefox mientras realiza cambios en sus archivos .js para que los vea instantáneamente después de una actualización de página.
También he luchado con este problema durante horas. He intentado inyectar cadenas aleatorias usando Javascript, pero este método parece estúpido y feo. Una posible forma de manejar este problema es introducir una etiqueta personalizada. Ver este document para más detalles:
Específicamente, debe crear un paquete llamado templatetags
en cualquier aplicación que haya creado (o crear uno nuevo si lo desea). Y creas cualquier archivo en este paquete, y escribes algo como esto:
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)
entonces puede usar la etiqueta {% static_no_cache ''.../.../path...'' %}
para crear una ruta con argumentos aleatorios.
¡Espero que esto ayude!
Borrado del archivo estático
python manage.py collectstatic --noinput --clear
. Esto borrará las estadísticas de antemano.Borrar el caché del navegador
Agregue una cadena aleatoria después de incluir el archivo js, por ejemplo, jquery.js? Rand = 23423423, con cada carga.
¿Te ayudó?