#32648 closed Bug (fixed)
New sitemap 'alternates' generation feature is bugged using default values.
Reported by: | Arthur | Owned by: | nobody |
---|---|---|---|
Component: | contrib.sitemaps | Version: | 3.2 |
Severity: | Release blocker | Keywords: | alternates |
Cc: | Carlton Gibson, Florian Demmer | Triage Stage: | Ready for checkin |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
(First time reporting a bug in Django, please be kind)
Hi,
When closing ticket #27395 with the following commit https://github.com/django/django/commit/16218c20606d8cd89c5393970c83da04598a3e04# a bug was added in Django.
If alternates is set to False, or if i18n is disabled on the sitemap, this line https://github.com/django/django/commit/16218c20606d8cd89c5393970c83da04598a3e04#diff-d0316d5baddb3fd017c4a17ac10d784a4668a05ae39bf8a0485ec80da1409c51R189 will not get executed, meaning url_info
will not have alternates
set.
Later, when rendering in the template, the inner loop (https://github.com/django/django/commit/16218c20606d8cd89c5393970c83da04598a3e04#diff-a2c649c9d199c72cb1df4204ce54d92a480f4f077e7b423db91ee1ab421895d8R10) will try to access alternates anyway, causing the following stacktrace to be printed
[DEBUG ] (base._resolve_lookup) Exception while resolving variable 'alternates' in template 'sitemap.xml'. Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 829, in _resolve_lookup current = current[bit] KeyError: 'alternates' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 837, in _resolve_lookup current = getattr(current, bit) AttributeError: 'dict' object has no attribute 'alternates' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 843, in _resolve_lookup current = current[int(bit)] ValueError: invalid literal for int() with base 10: 'alternates' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 848, in _resolve_lookup raise VariableDoesNotExist("Failed lookup for key " django.template.base.VariableDoesNotExist: Failed lookup for key [alternates] in {'item': <Item __str__>, 'location': 'https://myurl', 'lastmod': None, 'changefreq': 'always', 'priority': ''}
A simple fix is the meantime is to redefine the _urls() method in the Sitemap to include the alternates attribute to an empty list :
class Sitemap(sitemaps.Sitemap): """ Fixes the Exception while resolving variable 'alternates' in template 'sitemap.xml' """ def _urls(self, *args, **kwargs): urls = super()._urls(*args, **kwargs) for url_info in urls: url_info['alternates'] = [] return urls
That said, the patch is probably a 1-liner, to check if url.alternates exist before using it.
Change History (5)
comment:1 by , 3 years ago
Has patch: | set |
---|
comment:2 by , 3 years ago
Cc: | added; removed |
---|---|
Needs documentation: | set |
Needs tests: | set |
Severity: | Normal → Release blocker |
Triage Stage: | Unreviewed → Accepted |
Thanks for this report.
comment:3 by , 3 years ago
Needs documentation: | unset |
---|---|
Needs tests: | unset |
Triage Stage: | Accepted → Ready for checkin |
Here's the pull request that should fix the problem https://github.com/django/django/pull/14259.