{{{
>>> from django.core.urlresolvers import reverse_lazy, resolve
>>> proxy = reverse_lazy('admin:index')
>>> resolve(proxy)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/django/core/urlresolvers.py", line 453, in resolve
return get_resolver(urlconf).resolve(path)
File "/django/core/urlresolvers.py", line 315, in resolve
match = self.regex.search(path)
TypeError: expected string or buffer
}}}
The fix is dirt simple in userland, because you can just call
str/unicode/force_unicode on the proxy to evaluate it into a path. The
problem lies in the path given to `resolve` being directly handed off to
the `re` module, without being checked for validity.
{{{
>>> from django.core.urlresolvers import reverse_lazy, resolve
>>> proxy = reverse_lazy('admin:index')
>>> from django.utils.encoding import force_unicode
>>> resolve(force_unicode(proxy))
ResolverMatch(func=<function index at 0x10ae0b230>, args=(), kwargs={},
url_name='index', app_name='admin', namespace='admin')
}}}
Both the above assume a project with `django.contrib.admin` in
INSTALLED_APPS, because it's the easiest way of ensuring there's views to
resolve :)
I think that the issue should be documented; it's not something that's
common, and if you encounter it, one would hope you've got a reasonable
idea about where the problem lies, and it's probably safer to document it
than promote forced evaluation into the `resolve` method of
`RegexURLResolver` Marking as easy pickings on that basis.
--
Ticket URL: <https://code.djangoproject.com/ticket/21043>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* status: new => assigned
* needs_docs: => 0
* owner: nobody => DanRJohnson
* needs_tests: => 0
* needs_better_patch: => 0
--
Ticket URL: <https://code.djangoproject.com/ticket/21043#comment:1>
* component: Documentation => Core (URLs)
* needs_tests: 0 => 1
* stage: Unreviewed => Accepted
Comment:
I can confirm this issue.
However, I think that resolve should be fixed to work correctly with the
proxy object returned by reverse_lazy. I think we should fix the issue
with resolve not evaluating the proxy object instead of documenting a work
around.
--
Ticket URL: <https://code.djangoproject.com/ticket/21043#comment:2>
* has_patch: 0 => 1
* type: Cleanup/optimization => Bug
Comment:
I've created a patch and created a pull request.
https://github.com/django/django/pull/1570
--
Ticket URL: <https://code.djangoproject.com/ticket/21043#comment:3>
* owner: DanRJohnson =>
* status: assigned => new
--
Ticket URL: <https://code.djangoproject.com/ticket/21043#comment:4>
* needs_tests: 1 => 0
--
Ticket URL: <https://code.djangoproject.com/ticket/21043#comment:5>
* status: new => closed
* resolution: => fixed
--
Ticket URL: <https://code.djangoproject.com/ticket/21043#comment:6>
Comment (by grue):
This has been closed as per
https://github.com/django/django/commit/df462cf7604578c2afd43b988b7ea1fe5e727896
--
Ticket URL: <https://code.djangoproject.com/ticket/21043#comment:7>