#23403 closed Bug (fixed)
sitemap crashes if lastmod returns a date (instead of datetime)
| Reported by: | Igor Koshkarov | Owned by: | Tim Graham |
|---|---|---|---|
| Component: | contrib.sitemaps | Version: | 1.7 |
| Severity: | Release blocker | Keywords: | date utctimetuple |
| Cc: | 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 (last modified by )
When building a sitemap I receive
Django Version: 1.7 Exception Type: AttributeError Exception Value: 'datetime.date' object has no attribute 'utctimetuple' Exception Location: <skipped>/Django/lib/python2.7/site-packages/django/contrib/sitemaps/views.py in sitemap, line 78
Workaround can be done as:
diff --git a/django/contrib/sitemaps/views.py b/django/contrib/sitemaps/views.py
index aa184e9..d74c55b 100644
--- a/django/contrib/sitemaps/views.py
+++ b/django/contrib/sitemaps/views.py
@@ -8,6 +8,7 @@ from django.http import Http404
from django.template.response import TemplateResponse
from django.utils import six
from django.utils.http import http_date
+from datetime import datetime
def x_robots_tag(func):
@@ -71,7 +72,7 @@ def sitemap(request, sitemaps, section=None,
raise Http404("No page '%s'" % page)
response = TemplateResponse(request, template_name, {'urlset': urls},
content_type=content_type)
- if hasattr(site, 'latest_lastmod'):
+ if hasattr(site, 'latest_lastmod') and type(site.latest_lastmod) is datetime:
# if latest_lastmod is defined for site, set header so as
# ConditionalGetMiddleware is able to send 304 NOT MODIFIED
response['Last-Modified'] = http_date(
Attachments (1)
Change History (12)
comment:1 by , 11 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:2 by , 11 years ago
| Description: | modified (diff) |
|---|---|
| Easy pickings: | unset |
| Needs tests: | set |
comment:3 by , 11 years ago
This code works fine in Django 1.6.6
The error appeared in Django 1.7
I suppose this error is highly dependent on the type of date_field - see info_dict1 in urls.py
Thanks.
comment:4 by , 11 years ago
| Patch needs improvement: | set |
|---|---|
| Severity: | Normal → Release blocker |
| Summary: | Sitemap bug → sitemap crashes if lastmod returns a date (instead of datetime) |
| Triage Stage: | Unreviewed → Accepted |
I think the correct solution would be to use the date for the Last-Modified header, not skip it as the patch in the ticket description does.
Here's the commit where the feature was added:
https://github.com/django/django/commit/8f5533ab250df07ea84f98d39808806e282468a5
comment:5 by , 11 years ago
OK, in this case there could be more clear solution, working for both date and datetime:
@@ -75,5 +75,5 @@
# if latest_lastmod is defined for site, set header so as
# ConditionalGetMiddleware is able to send 304 NOT MODIFIED
responseLast-Modified = http_date(
- timegm(site.latest_lastmod.utctimetuple()))
+ timegm(site.latest_lastmod.timetuple()))
return response
Thank you!
comment:6 by , 11 years ago
Does that change alter the value that's returned if the datetime is time-zone aware? Do you plan to add a regression test for this?
comment:7 by , 11 years ago
| Owner: | changed from to |
|---|
comment:9 by , 11 years ago
| Triage Stage: | Accepted → Ready for checkin |
|---|
comment:10 by , 11 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
Could you please include code to reproduce the issue (ideally as a test for Django's test suite)? Did your code work in Django 1.6?