从django 4.1开始,模板被缓存为DEBUG=True,这个解决方案正确吗?

egmofgnx  于 2022-11-19  发布在  Go
关注(0)|答案(1)|浏览(116)

如文档中所述,从4.1开始,模板加载的默认行为发生了巨大变化。
如果我没理解错的话,在4.0之前,它是这样工作的:

  • 启用DEBUG后,每个请求都会加载模板,因此,如果您在处理模板时不断进行更改和重新加载,则始终会看到最新版本。
  • 如果禁用DEBUG,则在初始化应用程序时会缓存模板,因此只有在重新启动应用程序时才能看到模板中的更改。

这样,模板缓存就可以在生产环境中无缝启用,这非常棒。
现在包含了this ticket建议,如果我理解正确的话,必须指定模板加载方法,它不再与DEBUG设置绑定,并且默认情况下缓存。
我们需要原始行为,以便前端开发人员无需重新启动应用即可看到更改,并且我们还希望生产部署启用缓存,因此我们这样做:

develop_loaders = [
    "django.template.loaders.filesystem.Loader",
    "django.template.loaders.app_directories.Loader",
]
production_loaders = [
    ("django.template.loaders.cached.Loader", [
        "django.template.loaders.filesystem.Loader",
        "django.template.loaders.app_directories.Loader",
        "path.to.custom.Loader",
    ])
]
TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [
            "templates",
        ],
        "OPTIONS": {
            "context_processors": [
                "maintenance_mode.context_processors.maintenance_mode",
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
                "wagtail.contrib.settings.context_processors.settings",
            ],
            "loaders": develop_loaders if DEBUG else production_loaders,
        },
    },
]

这是可行的,但我想知道,我得到的情况正确吗?你认为这是一个坚实的解决方案吗?
我也花了一段时间,因为当我阅读4.1的变更日志时,我并没有意识到这个变更会有这样的影响(我们之前从未在设置中指定任何加载器),所以我们希望默认行为会得到尊重,这导致了gunicorn和docker被视为第一个可疑的罪魁祸首,等等...所以我想这个问题可能对其他处于类似情况的人有用。

4xrmg8kj

4xrmg8kj1#

问题不在于缓存的加载程序,而在于操作系统的信号处理。缓存的加载程序有一个在file_changed上调用的reset方法,这样即使在调试缓存的模板时也能受益。
您使用runserver_plus吗?它有一个问题:https://github.com/django-extensions/django-extensions/issues/1766
我在使用正常的runserver命令时没有遇到此问题。

相关问题