#2977: Better handling of regular expressions for reverse urlresolver
---------------------------+------------------------------------------------
Reporter: SmileyChris | Owner: nobody
Status: new | Component: Core framework
Version: | Resolution:
Keywords: | Stage: Accepted
Has_patch: 1 | Needs_docs: 0
Needs_tests: 0 | Needs_better_patch: 1
---------------------------+------------------------------------------------
Changes (by Matthew Flanagan <[EMAIL PROTECTED]>):
* cc: [EMAIL PROTECTED] (added)
* needs_better_patch: 0 => 1
Comment:
this patch does not work for me. Even after manually applying it to latest
trunk it fails with the following complex regexp:
{{{
IP4_RE =
r'(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}'
IP6_HEX_RE = r'(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}'
IP6_HEX_COMPRESSED_RE = r'((?:[0-9A-Fa-f]{1,4}(?::[0-9A-
Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)'
IP6_IP4_COMPAT_RE = r'((?:[0-9A-
Fa-f]{1,4}:){6,6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}'
IP6_IP4_COMPAT_COMPRESSED_RE = r'((?:[0-9A-Fa-f]{1,4}(?::[0-9A-
Fa-f]{1,4})*)?)::((?:[0-9A-
Fa-f]{1,4}:)*)(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}'
IP6_RE = '%s|%s|%s|%s' % (IP6_HEX_RE, IP6_HEX_COMPRESSED_RE,
IP6_IP4_COMPAT_RE, IP6_IP4_COMPAT_COMPRESSED_RE)
IP6_RE_COMPILED = re.compile('^(%s|%s|%s|%s)$' % (IP6_HEX_RE,
IP6_HEX_COMPRESSED_RE, IP6_IP4_COMPAT_RE,
IP6_IP4_COMPAT_COMPRESSED_RE))
IP_RE = "(%s|%s)" % (IP4_RE, IP6_RE)
urlpatterns = patterns('',
url(r'^(?P<ipsupernetwork>%s)/$' % IP_RE, ipnetwork_list,
IPNETWORK_LIST,
name='ipnetwork_list'),
)
}}}
Running django.core.urlresolvers.reverse results in:
{{{
In [6]: reverse('ipnetwork_list', urlconf='nong.ip.urls',args=(),
kwargs={'ipsupernetwork': '10.0.0.0'})
---------------------------------------------------------------------------
sre_constants.error Traceback (most
recent call last)
/srv/dev/mpf/nong/third-party/django/tests/<ipython console>
/srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
reverse(viewname, urlconf, args, kwargs)
399 def reverse(viewname, urlconf=None, args=None, kwargs=None):
400 args = args or []
401 kwargs = kwargs or {}
--> 402 return iri_to_uri(u'/' +
get_resolver(urlconf).reverse(viewname, *args, **kwargs))
403
/srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
reverse(self, lookup_view, *args, **kwargs)
383 except (ImportError, AttributeError):
384 raise NoReverseMatch
--> 385 if lookup_view in self.reverse_dict:
386 return u''.join([reverse_helper(part.regex, *args,
**kwargs) for part in self.reverse_dict[lookup_view]])
387 raise NoReverseMatch
/srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
_get_reverse_dict(self)
317
318 def _get_reverse_dict(self):
--> 319 if not self._reverse_dict and hasattr(self.urlconf_module,
'urlpatterns'):
320 for pattern in
reversed(self.urlconf_module.urlpatterns):
321 if isinstance(pattern, RegexURLResolver):
/srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
_get_urlconf_module(self)
353 except AttributeError:
354 try:
--> 355 self._urlconf_module =
__import__(self.urlconf_name, {}, {}, [''])
356 except ValueError, e:
357 # Invalid urlconf_name, such as "foo.bar." (note
trailing period)
/srv/dev/mpf/nong/third-party/django/tests/nong/ip/urls.py
13 (r'^url_tag/', include('regressiontests.templates.urls')),
14
15 # django built-in views
16 (r'^views/', include('regressiontests.views.urls')),
17 )
/srv/dev/mpf/nong/third-party/django/django/conf/urls/defaults.py in
url(regex, view, kwargs, name, prefix)
28 raise ImproperlyConfigured('Empty URL pattern view
name not permitted (for pattern %r)' % regex)
29 if prefix:
30 view = prefix + '.' + view
---> 31 return RegexURLPattern(regex, view, kwargs, name)
32
/srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
__init__(self, regex, callback, default_args, name)
239 # callable object (view).
240 self.regex = re.compile(regex, re.UNICODE)
--> 241 self.reverse_regex_lookup = ReverseRegexLookup(regex)
242 if callable(callback):
243 self._callback = callback
/srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
__init__(self, text)
194 class ReverseRegexLookup(object):
195 def __init__(self, text):
--> 196 self.tokens, self.minimum_arguments, self.error =
tokenize(text)
197
198 def check(self, args=[], kwargs={}):
/srv/dev/mpf/nong/third-party/django/django/core/urlresolvers.py in
tokenize(text)
179 if isinstance(bit, list):
180 # Build the regex here so it only has to be compiled
once.
--> 181 bit = re.compile('%s$' % build_re(bit))
182 count += 1
183 else:
/usr/local/lib/python2.4/sre.py in compile(pattern, flags)
178 def compile(pattern, flags=0):
179 "Compile a regular expression pattern, returning a pattern
object."
--> 180 return _compile(pattern, flags)
181
182 def purge():
/usr/local/lib/python2.4/sre.py in _compile(*key)
225 p = sre_compile.compile(pattern, flags)
226 except error, v:
--> 227 raise error, v # invalid expression
228 if len(_cache) >= _MAXCACHE:
229 _cache.clear()
error: multiple repeat
}}}
--
Ticket URL: <http://code.djangoproject.com/ticket/2977#comment:22>
Django Code <http://code.djangoproject.com/>
The web framework for perfectionists with deadlines
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---