2010-12-01 40 views
20

Cuando realizo una modificación en un archivo de origen python en mi proyecto, Django lo detecta y reinicia el servidor de ejecución. Pero cuando modifico una plantilla django, tengo que matar a runserver y reiniciarlo de nuevo: ¿cómo puedo hacer para que runserver se reinicie automáticamente en el cambio de plantilla?¿Cómo hacer que Django reinicie runserver en el cambio de plantilla?

Respuesta

16

El archivo se leerá de forma predeterminada en el disco en cada solicitud, por lo que no es necesario reiniciar nada.

Hay un cargador de plantillas de almacenamiento en caché, pero está deshabilitado de forma predeterminada. Vea the documentation para más información.

+1

En la configuración, olvidé que configuré el almacenamiento en caché de la plantilla. Así que reemplazo ('django.template.loaders.cached.Loader', ('django.template.loaders.app_directories.Loader',)), por 'django.template.loaders.app_directories.Loader', y ahora no reinicio es necesario: muchas gracias – Eric

+1

No estoy teniendo este problema con las plantillas normales (solo se utilizan las configuraciones predeterminadas), pero estoy teniendo este problema con algunas anulaciones de formas crudas. (solo se actualizan al reiniciar). Creo que esto se debe a que las plantillas de formas cruzadas se cargan desde una etiqueta de plantilla. ¿Alguna idea de lo que está pasando aquí? –

+2

parece que la razón por la que las plantillas de formas cruzadas requieren un reinicio es que usan la función memoize() para almacenar en caché las plantillas. No hay forma de apagarlo en modo dev lo que puede causar mucha confusión. Mirando a través de la fuente de Django, el único otro lugar que memoize() se usa es almacenar patrones, por lo que runserver requiere un reinicio si cambias las URL. –

6

Ejecute touch contra uno de los archivos fuente de Python.

Como runserver monitorea los archivos .py por cambios, no se reinicia para un cambio en las plantillas (.html). Puede desencadenar este reinicio mediante la edición virtual de cualquiera de los archivos .py utilizando el comando touch, que actualiza su fecha y deja todos los demás contenidos iguales.

+0

El OP ya dijo que editó un archivo fuente de Python, por lo que no veo qué cambiaría 'touch '. – metakermit

+2

@ kermit666: No, dijo que editó una plantilla. Las plantillas no son archivos fuente de Python. –

+0

OK, tienes razón, mi error. Me retractaré del voto negativo una vez que se desbloquee. Aunque el método todavía es un poco hacky para mi gusto :) Idealmente tendríamos una buena integración entre grunt-contrib-watch y el servidor de ejecución de Django. – metakermit

5

Para añadir a la respuesta de knutin, el problema que se enfrentan es causada precisamente por FetchFromCacheMiddleware así que todo lo que tiene que hacer es deshabilitarlo en el archivo settings.py de la siguiente manera:

settings.py:

MIDDLEWARE_CLASSES = (
    ... 
    #'django.middleware.cache.FetchFromCacheMiddleware', 
    ... 
) 
0

Tuve un problema similar, sin embargo, mis plantillas requerían un script django manager para poder actualizarlas. No hay una manera simple de hacer que django vea otros tipos de archivos, pero aquí hay un trabajo que yo uso.

Este es un proceso independiente que ahora utilizan para ejecutar el servidor dev:

#!/usr/bin/python 

import time, subprocess, sys, os, re 
from threading import Thread 

run = True 

def monitor(): 
    while run: 
    os.system("./manage.py update_templates") 
    os.system("touch website/urls.py") 
    os.system("inotifywait -e modify,create,delete website/templates/*.html") 

t = Thread(target=monitor) 
t.start() 
time.sleep(0.5) 

args = '' 
if len(sys.argv) > 1: 
    for i in range(1, len(sys.argv)): 
    args += sys.argv[i] +' ' 
print("./manage.py runserver %s" % args) 
os.system("./manage.py runserver %s" % args) 
run = False 
t.join() 

Este script funciona bajo los siguientes supuestos:

  1. Uso python3
  2. Este script se coloca al lado de manager.py
  3. manager.py es ejecutable
  4. La aplicación web se llama sitio web
  5. El sitio web tiene un archivo llamado sitio web/urls.py
  6. Estás usando GNU/Linux, que es compatible con inotify
0

El archivo se lee desde el disco sin la necesidad de reiniciar ejecución del servidor, basta con Seguro que deshabilitas todo el almacenamiento en caché.

deshabilitar la caché cargador de plantillas

el cargador de plantilla en caché no está habilitado por defecto, pero que podría haber permitido que esta en ti ajustes de producción. Asegúrese de que el cargador de plantillas en caché no esté habilitado en su configuración de desarrollo. Django docs on the cached template loader

utilizar el marco de almacenamiento en caché simulado

Cuando se está utilizando la arquitectura de almacenamiento en caché de Django esto puede causar las plantillas no para recargar.El marco predeterminado que utiliza Django es el almacenamiento en caché de memoria local, lo que significa que tendrá que configurar explícitamente el almacenamiento en caché para desactivar el marco de almacenamiento en caché. Django docs on dummy caching

1

No es necesario reiniciar el servidor para volver a cargar los cambios de la plantilla.

En la producción se puede hacer esto:
En settings.py, para las plantillas de configuración
- Quitar los APP_DIRS ajuste
- En lugar de ello, agregue esta configuración para OPCIONES:

'loaders': [ 
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
], 

por qué esto funciona :
La configuración de DEPURACIÓN es verdadera por defecto (en modo de desarrollo). En este modo, Django no almacena en caché las plantillas. Pero en el modo de producción (es decir, DEBUG = False), Django habilita el almacenamiento en caché de plantillas. Por lo tanto, se necesita reiniciar el servidor para volver a cargar la plantilla editada/tocada.

Nota:
Tenga en cuenta que, al deshabilitar el almacenamiento en caché de plantillas, en su máquina de producción, agregará una sobrecarga por cada solicitud que se realice.

Cuestiones relacionadas