{{{#!python
>>> from django.template import Template, Context
>>> Template('{{ inf }}').render(Context({'inf': 'xxx'}))
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/tmp/venv/lib/python2.7/site-packages/django/template/base.py",
line 191, in __init__
self.nodelist = self.compile_nodelist()
File "/tmp/venv/lib/python2.7/site-packages/django/template/base.py",
line 233, in compile_nodelist
e.template_debug = self.get_exception_info(e, e.token)
AttributeError: 'exceptions.OverflowError' object has no attribute 'token'
}}}
It also fails if the variable is undefined in the context:
{{{#!python
>>> Template('{{ inf }}').render(Context())
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/tmp/venv/lib/python2.7/site-packages/django/template/base.py",
line 191, in __init__
self.nodelist = self.compile_nodelist()
File "/tmp/venv/lib/python2.7/site-packages/django/template/base.py",
line 233, in compile_nodelist
e.template_debug = self.get_exception_info(e, e.token)
AttributeError: 'exceptions.OverflowError' object has no attribute 'token'
}}}
This is happening because `'inf'` is used in Python to represent infinity:
{{{#!python
>>> float('inf')
inf
}}}
The problem appears to be with
[https://github.com/django/django/blob/1.11.6/django/template/base.py#L809-L819
this bit of the code]:
{{{#!python
# First try to treat this variable as a number.
#
# Note that this could cause an OverflowError here that we're
not
# catching. Since this should only happen at compile time,
that's
# probably OK.
self.literal = float(var)
# So it's a float... is it an int? If the original value
contained a
# dot or an "e" then it was a float, not an int.
if '.' not in var and 'e' not in var.lower():
self.literal = int(self.literal)
}}}
It successfully converts the string `'inf'` to a float with value of
infinity, but then trying to convert this float to an int causes the
OverflowError:
{{{#!python
>>> int(float('inf'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: cannot convert float infinity to integer
}}}
Python also supports floats of `'-inf'` and `'nan'`. Using `'-inf'` as a
template variable name doesn't work because it isn't a valid variable
name. Using `'nan'` as a template variable name works OK:
{{{#!python
>>> Template('{{ nan }}').render(Context({'nan': 'xxx'}))
u'xxx'
}}}
I think the fix is to allow variables named **inf**, rather than to
support using **inf** as a float literal within templates.
--
Ticket URL: <https://code.djangoproject.com/ticket/28721>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* stage: Unreviewed => Accepted
--
Ticket URL: <https://code.djangoproject.com/ticket/28721#comment:1>
* owner: nobody => Levi Payne
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/28721#comment:2>
Comment (by Levi Payne):
[https://github.com/django/django/pull/9258 WIP Pull Request]
--
Ticket URL: <https://code.djangoproject.com/ticket/28721#comment:3>
* has_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/28721#comment:4>
Comment (by Levi Payne):
Pull Request is ready for review.
--
Ticket URL: <https://code.djangoproject.com/ticket/28721#comment:5>
* needs_better_patch: 0 => 1
--
Ticket URL: <https://code.djangoproject.com/ticket/28721#comment:6>
Comment (by Fraser Nevett):
See also #28730
--
Ticket URL: <https://code.djangoproject.com/ticket/28721#comment:7>
Comment (by Tim Graham <timograham@…>):
In [changeset:"6c3104221b2cb9f068c07adf3ef24c9f49627834" 6c31042]:
{{{
#!CommitTicketReference repository=""
revision="6c3104221b2cb9f068c07adf3ef24c9f49627834"
Refs #28721 -- Added test for variations of 'inf'/'infinity' as a template
variable names.
Fixed by 9ec7d8e514e09636b0ab4bcac74b5f7a5be335a3.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/28721#comment:8>
* status: assigned => closed
* resolution: => fixed
--
Ticket URL: <https://code.djangoproject.com/ticket/28721#comment:9>