如何让Django在模板更改时重启runserver?

时间:2010-12-01 08:56:35

标签: django templates

当我在项目中的python源文件中进行修改时,Django检测到并重启runserver本身。但是当我修改django模板时,我必须杀死runserver并重新启动它:如何在模板更改时自动重启runserver?

7 个答案:

答案 0 :(得分:18)

默认情况下,每次请求都会从磁盘读取文件,因此无需重新启动任何内容。

有一个缓存模板加载器,但默认情况下它被禁用。有关详细信息,请参阅the documentation

答案 1 :(得分:8)

针对其中一个Python源文件运行touch

因为runserver监视.py文件的更改,所以不会重新启动以更改模板(.html)。您可以使用touch命令虚拟编辑任何.py文件来触发此重新启动,该命令刷新其修改日期并保留所有其他内容相同。

答案 2 :(得分:7)

要添加knutin的答案,您面临的问题恰恰是由FetchFromCacheMiddleware引起的,因此您需要做的就是在settings.py文件中将其禁用,如下所示:

settings.py:

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

答案 3 :(得分:1)

我遇到了类似的问题,但是我的模板需要运行django manager脚本才能更新它们。没有简单的方法让django观看其他文件类型,但这是我使用的工作。

这是我现在用来运行开发服务器的独立脚本:

#!/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. 此脚本位于manager.py
  3. 旁边
  4. manager.py可以运行
  5. 网络应用程序称为网站
  6. 该网站有一个名为website / urls.py
  7. 的文件
  8. 您正在使用支持inotify的GNU / Linux

答案 4 :(得分:1)

您无需重新启动服务器即可重新加载模板更改。

在制作中你可以这样做:
在settings.py中,用于TEMPLATES配置
- 删除APP_DIRS设置
- 而是将此设置添加到OPTIONS:

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

为什么会这样:
默认情况下,DEBUG设置为True(在开发模式下)。在这种模式下,Django不会缓存模板。但是在生产模式下(即DEBUG = False),Django启用了模板缓存。因此,需要重新启动服务器以重新加载已编辑/触摸的模板。

注意:
请注意以下事实:通过禁用模板缓存,您将在生产计算机上为每个请求添加开销。

答案 5 :(得分:1)

另一种解决方案是确保debug

中的TEMPLATES配置中的settings.py设置为true
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时,您必须手动重启服务器以查看对模板所做的任何更改(因为它们不会自动触发重启)

答案 6 :(得分:0)

该文件将从磁盘读取而无需重新启动runserver,只需确保禁用所有缓存。

禁用缓存模板加载程序

默认情况下未启用缓存模板加载程序,但您可能已在生产设置中启用了此功能。确保未启用缓存模板加载器的开发设置。 Django docs on the cached template loader

使用虚拟缓存框架

当您使用django缓存框架时,这可能导致模板无法重新加载。 Django使用的默认框架是本地内存缓存,这意味着您必须显式设置虚拟缓存以禁用缓存框架。 Django docs on dummy caching