Как заставить Django перезапустить runserver при смене шаблона? - PullRequest
25 голосов
/ 01 декабря 2010

Когда я делаю изменение в исходном файле python в моем проекте, Django обнаруживает это и перезапускает сам runserver.Но когда я изменяю шаблон django, мне нужно убить runserver и перезапустить его снова: как мне сделать так, чтобы runserver автоматически перезапускался при смене шаблона?

Ответы [ 7 ]

18 голосов
/ 01 декабря 2010

Файл будет по умолчанию считываться с диска при каждом запросе, поэтому нет необходимости перезапускать что-либо.

Загрузчик шаблонов кэширования существует, но по умолчанию он отключен.См. документацию для получения дополнительной информации.

8 голосов
/ 01 декабря 2010

Выполнить touch для одного из исходных файлов Python.

Поскольку runserver отслеживает изменения в файлах .py, он не перезапускается при изменении шаблонов (.html). Вы можете запустить этот перезапуск путем виртуального редактирования любого из файлов .py с помощью команды touch, которая обновляет дату изменения и оставляет все остальное содержимое таким же.

7 голосов
/ 24 мая 2012

Чтобы добавить ответ Кнутина, проблема, с которой вы столкнулись, в точности вызвана FetchFromCacheMiddleware, поэтому все, что вам нужно сделать, это отключить ее в файле settings.py следующим образом:

settings.py:

MIDDLEWARE_CLASSES = (
    ...
    #'django.middleware.cache.FetchFromCacheMiddleware',
    ...
)
2 голосов
/ 16 июня 2018

Другое решение состоит в том, чтобы убедиться, что для вас debug установлено значение true внутри вас TEMPLATES config в settings.py

DEBUG = True

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templates/'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'debug': DEBUG,
        },
    },
]

Когда debug имеет значение False, необходимо вручную перезапустить сервер, чтобы увидеть любые изменения, внесенные в шаблоны (поскольку они не вызывают автоматический перезапуск)

1 голос
/ 23 ноября 2017

Вам не нужно перезагружать сервер, чтобы перезагрузить изменения шаблона.

В производстве вы можете сделать это:
В settings.py для конфигурации TEMPLATES
- удалить параметр APP_DIRS
- Вместо этого добавить этот параметр в ОПЦИИ:

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

Почему это работает:
По умолчанию для параметра DEBUG установлено значение True (в режиме разработки).В этом режиме Django не кеширует шаблоны.Но в производственном режиме (т.е. DEBUG = False) Django включает кэширование шаблонов.Следовательно, для перезагрузки отредактированного / отредактированного шаблона необходим перезапуск сервера.

Примечание:
Помните о том, что - отключив кэширование шаблонов, на производственном компьютере вы добавите издержки для каждого запросачто проходит.

1 голос
/ 05 января 2015

У меня была похожая проблема, однако мои шаблоны требовали запуска сценария менеджера django для их обновления. Нет простого способа заставить django наблюдать за другими типами файлов, но здесь есть обходной путь, который я использую.

Это автономный скрипт, который я сейчас использую для запуска сервера 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()

Этот скрипт работает в следующих предположениях:

  1. Использование python3
  2. Этот скрипт размещен вдоль side manager.py
  3. manager.py работает
  4. Веб-приложение называется веб-сайт
  5. На сайте есть файл с именем website / urls.py
  6. Вы используете GNU / Linux, который поддерживает inotify
0 голосов
/ 09 ноября 2015

Файл будет считан с диска без необходимости перезапуска сервера запуска, просто убедитесь, что вы отключили все кэширование.

Отключите загрузчик шаблонов Cached

Кэшируетсязагрузчик шаблонов не включен по умолчанию, но вы могли включить это в своих производственных настройках.Убедитесь, что загрузчик кэшированных шаблонов не включен ваши настройки разработки. Документы Django в загрузчике кэшированных шаблонов

Использование фиктивной инфраструктуры кэширования

При использовании инфраструктуры кэширования Django это может привести к тому, что шаблоны не будутперезагрузить.Фреймворк по умолчанию, который использует Django, - это кэширование в локальной памяти, то есть вам придется явно настроить фиктивное кэширование, чтобы отключить фреймворк кэширования. Django документы по кешированию пустышки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...