Подтвердить что ты не робот

Как заставить Django перезапускать сервер при изменении шаблона?

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

4b9b3361

Ответ 1

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

Имеется загрузчик шаблонов кэширования, но по умолчанию он отключен. Подробнее см. документацию.

Ответ 2

Запустите touch в отношении одного из исходных файлов Python.

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

Ответ 3

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

settings.py:

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

Ответ 4

Вам не нужно перезапускать сервер для перезагрузки изменений шаблона.

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

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

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

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

Ответ 5

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

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

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

  • Использование python3
  • Этот script размещается вдоль side manager.py
  • manager.py запущен
  • Веб-приложение называется веб-сайтом
  • На веб-сайте есть файл под названием website/urls.py
  • Вы используете GNU/Linux, который поддерживает inotify

Ответ 6

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

Отключить загрузчик кэшированных шаблонов

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

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

Когда вы используете каркас кэширования django, это может привести к тому, что шаблоны не будут перезагружаться. Используемая по умолчанию инфраструктура Django использует кэширование локальной памяти, означающее, что вам нужно будет явно настроить фиктивное кэширование, чтобы отключить структуру кэширования. Django docs для фиктивного кэширования