Opened 3 weeks ago
Last modified 4 hours ago
#36728 assigned Cleanup/optimization
Validate template tag context argument at definition time, rather than compile time
| Reported by: | Jake Howard | Owned by: | Jake Howard |
|---|---|---|---|
| Component: | Template system | Version: | dev |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | yes |
| Easy pickings: | no | UI/UX: | no |
Description
If a template tag is defined incorrectly, by not accepting a context argument with takes_context=True:
@register.simple_tag(takes_context=True) def my_tag(): pass
An error is only raised when the template is compiled, rather than when the tag is defined as someone may expect. This means there’s extra work done at compile time, which is duplicated each time the tag is used, across multiple templates.
Moving this validation to be done at definition time would likely improve performance. Reading the function signature is already done at definition time, so the performance improvement will likely only be checking the list of arguments, but reporting the error earlier would probably also be a DX improvement.
See also forum thread.
Change History (3)
comment:1 by , 3 weeks ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:2 by , 3 weeks ago
| Has patch: | set |
|---|
As mentioned in the PR description, because the majority of the work was already being done eagerly, the performance benefit is likely to be within margin of error for Python benchmarks (it's just a list member check). Therefore, I've not done any benchmarks currently.
comment:3 by , 4 hours ago
| Patch needs improvement: | set |
|---|
Thank you Jake! Once the fix is in place, I would like to see some before/after benchmarks for the startup time to confirm the assumption that this won't hurt it.