#32744 closed Bug (fixed)
Template changes cause dev server to reload
Reported by: | Ryan P Kilby | Owned by: | Hasan Ramezani |
---|---|---|---|
Component: | Template system | Version: | 3.2 |
Severity: | Release blocker | Keywords: | autoreload |
Cc: | Ryan P Kilby, Tom Forbes | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | yes |
Easy pickings: | no | UI/UX: | no |
Description
Django 3.2 has changed the autoreload behavior of the dev server, and it now reloads on template file changes. Reverting to 3.1 fixes the issue. I believe this is related to #25791 and βhttps://github.com/django/django/pull/12928
Template settings:
DEBUG = True TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [os.path.join(BASE_DIR, "templates")], "APP_DIRS": True, "OPTIONS": { "debug": DEBUG, "context_processors": [ "django.template.context_processors.debug", "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", ], }, }, ]
Given that it can take several seconds for the dev server to reload, this change can be disruptive to template authoring.
Attachments (1)
Change History (13)
comment:1 by , 4 years ago
Cc: | added |
---|
comment:2 by , 4 years ago
Cc: | added |
---|
comment:3 by , 4 years ago
Resolution: | β worksforme |
---|---|
Status: | new β closed |
comment:4 by , 4 years ago
Resolution: | worksforme β needsinfo |
---|
Having seen the duplicate #32745 in the timeline, I've tried again here (double checking). It's still not reproducing with a fresh project so, still more info... π€
I'll upload a sample project with just a single view and template.
Observed: startproject
, startapp
, then app template and view. runserver
, edit the template. Not reload.
Clearly you're seeing something, but what?
Thanks.
by , 4 years ago
Attachment: | ticket32744.zip added |
---|
Barest project NOT reproducing editing the hello.html file whilst running the dev server.
comment:5 by , 4 years ago
Resolution: | needsinfo |
---|---|
Status: | closed β new |
Hi Carlton,
long time :)
Figured out how to reproduce the issue:
- Ensure
TEMPLATES["DIRS"]
contains a directory path that's a string instead of aPath
object. - Add a template to that directory, point a view to that template.
- Modify/save the template, observe reload
Specifically, the failure is occurring in the βtemplate_changed handler's if template_dir in file_path.parents
check. As template_dir
is a string, it fails the comparison to the parent Path
s. While the failure occurs here, I'm guessing that loader.get_dirs
should normalize its directories to Path
s.
Also, you'd only hit this issue when upgrading an older settings module. New projects are setup to use Path
s, while old projects would be building paths with os.path.join()
.
comment:6 by , 4 years ago
Keywords: | autoreload added |
---|---|
Severity: | Normal β Release blocker |
Triage Stage: | Unreviewed β Accepted |
Thanks for extra details, I'm was able to reproduce this issue with
'DIRS': ['template_dir']
,'DIRS': [Path('template_dir')]
, and'DIRS': ['/full/path/to/template_dir']
.
I think we should normalize directories to resolved Path
s, e.g.
diff --git a/django/template/autoreload.py b/django/template/autoreload.py index 36952ef9aa..6a648ce0c3 100644 --- a/django/template/autoreload.py +++ b/django/template/autoreload.py @@ -4,6 +4,7 @@ from django.template.backends.django import DjangoTemplates from django.utils.autoreload import ( autoreload_started, file_changed, is_django_path, ) +from django.utils._os import to_path def get_template_directories(): @@ -15,13 +16,13 @@ def get_template_directories(): if not isinstance(backend, DjangoTemplates): continue - items.update(backend.engine.dirs) + items.update(to_path(dir).resolve() for dir in backend.engine.dirs) for loader in backend.engine.template_loaders: if not hasattr(loader, 'get_dirs'): continue items.update( - directory + to_path(directory).resolve() for directory in loader.get_dirs() if not is_django_path(directory) )
Regression in 658bcc16f1b814b3a063d3fa16fabaea8b471863.
comment:7 by , 4 years ago
Owner: | changed from | to
---|---|
Status: | new β assigned |
comment:9 by , 4 years ago
Triage Stage: | Accepted β Ready for checkin |
---|
comment:10 by , 4 years ago
Patch needs improvement: | set |
---|---|
Triage Stage: | Ready for checkin β Accepted |
There's a Windows test failure to resolve. βhttps://djangoci.com/job/pull-requests-windows/database=sqlite3,label=windows,python=Python39/11480/
Hey Ryan π
Thanks for the report. I'm need more detail, as I'm struggling to reproduce.
Testing running with Django 3.2.3, both with Django's built-in runserver and Channels' ASGI based one too. I'm not seeing the auto-reload behaviour on template saves.
My
TEMPLATES
looks almost identical to yours.Obviously something is going on, but there must be more to itβ¦
What reloader are you using? π€