Template settings:
{{{#!div style="font-size: 90%"
{{{#!python
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.
--
Ticket URL: <https://code.djangoproject.com/ticket/32744>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* cc: Ryan P Kilby (added)
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:1>
* cc: Tom Forbes (added)
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:2>
* status: new => closed
* resolution: => worksforme
Comment:
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β¦
{{{
Watching for file changes with StatReloader
}}}
What reloader are you using? π€
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:3>
* resolution: worksforme => needsinfo
Comment:
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.
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:4>
* Attachment "ticket32744.zip" added.
Barest project NOT reproducing editing the hello.html file whilst running
the dev server.
* status: closed => new
* resolution: needsinfo =>
Comment:
Hi Carlton,
long time :)
Figured out how to reproduce the issue:
- Ensure `TEMPLATES["DIRS"]` contains a directory path that's a string
instead of a `Path` 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
[https://github.com/django/django/pull/12928/files#diff-
85e705dc6a3e8563ae082481a870c003b31fc639accfa6133e47477c9e964c90R48
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()`.
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:5>
* keywords: => autoreload
* severity: Normal => Release blocker
* stage: Unreviewed => Accepted
Comment:
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.
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:6>
* owner: nobody => Hasan Ramezani
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:7>
* has_patch: 0 => 1
Comment:
[https://github.com/django/django/pull/14407 PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:8>
* stage: Accepted => Ready for checkin
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:9>
* needs_better_patch: 0 => 1
* stage: Ready for checkin => Accepted
Comment:
There's a Windows test failure to resolve. https://djangoci.com/job/pull-
requests-windows/database=sqlite3,label=windows,python=Python39/11480/
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:10>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"68357b2ca9e88c40fc00d848799813241be39129" 68357b2]:
{{{
#!CommitTicketReference repository=""
revision="68357b2ca9e88c40fc00d848799813241be39129"
Fixed #32744 -- Normalized to pathlib.Path in autoreloader check for
template changes.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:11>
Comment (by Carlton Gibson <carlton.gibson@β¦>):
In [changeset:"c0d506f5ef253f006dbff0b0092c8eecbd45eedf" c0d506f5]:
{{{
#!CommitTicketReference repository=""
revision="c0d506f5ef253f006dbff0b0092c8eecbd45eedf"
[3.2.x] Fixed #32744 -- Normalized to pathlib.Path in autoreloader check
for template changes.
Backport of 68357b2ca9e88c40fc00d848799813241be39129 from main
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/32744#comment:12>