Opened 3 years ago

Closed 3 years ago

Last modified 3 years ago

#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 Arthur, 3 years ago

Has patch: set

Here's the pull request that should fix the problem https://github.com/django/django/pull/14259.

comment:2 by Mariusz Felisiak, 3 years ago

Cc: Carlton Gibson Florian Demmer added; Carlton Gibson removed
Needs documentation: set
Needs tests: set
Severity: NormalRelease blocker
Triage Stage: UnreviewedAccepted

Thanks for this report.

comment:3 by Carlton Gibson, 3 years ago

Needs documentation: unset
Needs tests: unset
Triage Stage: AcceptedReady for checkin

comment:4 by Carlton Gibson <carlton.gibson@…>, 3 years ago

Resolution: fixed
Status: newclosed

In 08c60cc:

Fixed #32648 -- Fixed VariableDoesNotExist rendering sitemaps template.

comment:5 by Carlton Gibson <carlton.gibson@…>, 3 years ago

In 65dfb06a:

[3.2.x] Fixed #32648 -- Fixed VariableDoesNotExist rendering sitemaps template.

Backport of 08c60cce3b13f6e60d7588206da2d3c71228f378 from main

Note: See TracTickets for help on using tickets.
Back to Top