Changeset 411
- Timestamp:
- 08/05/05 15:50:19 (3 years ago)
- Files:
-
- django/trunk/django/conf/urls/defaults.py (modified) (2 diffs)
- django/trunk/django/core/handlers/base.py (modified) (5 diffs)
- django/trunk/django/core/urlresolvers.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/conf/urls/defaults.py
r3 r411 1 from django.core.urlresolvers import RegexURL MultiplePattern, RegexURLPattern1 from django.core.urlresolvers import RegexURLPattern, RegexURLResolver 2 2 3 3 __all__ = ['handler404', 'handler500', 'include', 'patterns'] … … 12 12 for t in tuples: 13 13 if type(t[1]) == list: 14 pattern_list.append(RegexURL MultiplePattern(t[0], t[1][0]))14 pattern_list.append(RegexURLResolver(t[0], t[1][0])) 15 15 else: 16 16 pattern_list.append(RegexURLPattern(t[0], prefix and (prefix + '.' + t[1]) or t[1], *t[2:])) django/trunk/django/core/handlers/base.py
r298 r411 52 52 return response 53 53 54 conf_module = __import__(ROOT_URLCONF, '', '', ['']) 55 resolver = urlresolvers.RegexURLResolver(conf_module.urlpatterns) 54 resolver = urlresolvers.RegexURLResolver(r'^/', ROOT_URLCONF) 56 55 try: 57 56 callback, param_dict = resolver.resolve(path) … … 66 65 return self.get_technical_error_response(is404=True) 67 66 else: 68 resolver = urlresolvers.Error404Resolver(conf_module.handler404) 69 callback, param_dict = resolver.resolve() 67 callback, param_dict = resolver.resolve404() 70 68 return callback(request, **param_dict) 71 69 except db.DatabaseError: … … 77 75 message = "%s\n\n%s" % (self._get_traceback(), request) 78 76 mail_admins(subject, message, fail_silently=True) 79 return self.get_friendly_error_response(request, conf_module)77 return self.get_friendly_error_response(request, resolver) 80 78 except exceptions.PermissionDenied: 81 79 return httpwrappers.HttpResponseForbidden('<h1>Permission denied</h1>') … … 91 89 message = "%s\n\n%s" % (self._get_traceback(), request_repr) 92 90 mail_admins(subject, message, fail_silently=True) 93 return self.get_friendly_error_response(request, conf_module)91 return self.get_friendly_error_response(request, resolver) 94 92 95 def get_friendly_error_response(self, request, conf_module):93 def get_friendly_error_response(self, request, resolver): 96 94 """ 97 95 Returns an HttpResponse that displays a PUBLIC error message for a … … 99 97 """ 100 98 from django.core import urlresolvers 101 resolver = urlresolvers.Error404Resolver(conf_module.handler500) 102 callback, param_dict = resolver.resolve() 99 callback, param_dict = resolver.resolve500() 103 100 return callback(request, **param_dict) 104 101 django/trunk/django/core/urlresolvers.py
r357 r411 19 19 class RegexURLPattern: 20 20 def __init__(self, regex, callback, default_args=None): 21 self.regex = re.compile(regex)21 # regex is a string representing a regular expression. 22 22 # callback is something like 'foo.views.news.stories.story_detail', 23 23 # which represents the path to a module and a view function name. 24 self.regex = re.compile(regex) 24 25 self.callback = callback 25 26 self.default_args = default_args or {} 26 27 27 def search(self, path):28 def resolve(self, path): 28 29 match = self.regex.search(path) 29 30 if match: … … 44 45 raise ViewDoesNotExist, "Tried %s in module %s. Error was: %s" % (func_name, mod_name, str(e)) 45 46 46 class RegexURLMultiplePattern: 47 def __init__(self, regex, urlconf_module): 47 class RegexURLResolver: 48 def __init__(self, regex, urlconf_name): 49 # regex is a string representing a regular expression. 50 # urlconf_name is a string representing the module containing urlconfs. 48 51 self.regex = re.compile(regex) 49 # urlconf_module is a string representing the module containing urlconfs. 50 self.urlconf_module = urlconf_module 52 self.urlconf_name = urlconf_name 51 53 52 def search(self, path):54 def resolve(self, path): 53 55 match = self.regex.search(path) 54 56 if match: 55 57 new_path = path[match.end():] 56 try: # Lazily load self.url_patterns.57 self.url_patterns58 except AttributeError:59 self.url_patterns = self.get_url_patterns()60 58 for pattern in self.url_patterns: 61 sub_match = pattern. search(new_path)59 sub_match = pattern.resolve(new_path) 62 60 if sub_match: 63 61 return sub_match 62 # None of the regexes matched, so raise a 404. 63 raise Http404, "Tried all URL patterns but didn't find a match for %r" % path 64 64 65 def get_url_patterns(self): 66 return __import__(self.urlconf_module, '', '', ['']).urlpatterns 65 def _get_urlconf_module(self): 66 self.urlconf_module = __import__(self.urlconf_name, '', '', ['']) 67 return self.urlconf_module 68 urlconf_module = property(_get_urlconf_module) 67 69 68 class RegexURLResolver:69 def __init__(self, url_patterns):70 # url_patterns is a list of RegexURLPattern or RegexURLMultiplePattern objects.71 self.url_patterns = url_patterns70 def _get_url_patterns(self): 71 self.url_patterns = self.urlconf_module.urlpatterns 72 return self.url_patterns 73 url_patterns = property(_get_url_patterns) 72 74 73 def resolve(self, app_path): 74 # app_path is the full requested Web path. This is assumed to have a 75 # leading slash but doesn't necessarily have a trailing slash. 76 # Examples: 77 # "/news/2005/may/" 78 # "/news/" 79 # "/polls/latest" 80 # A home (root) page is represented by "/". 81 app_path = app_path[1:] # Trim leading slash. 82 for pattern in self.url_patterns: 83 match = pattern.search(app_path) 84 if match: 85 return match 86 # None of the regexes matched, so raise a 404. 87 raise Http404, "Tried all URL patterns but didn't find a match for %r" % app_path 88 89 class Error404Resolver: 90 def __init__(self, callback): 91 self.callback = callback 92 93 def resolve(self): 94 mod_name, func_name = get_mod_func(self.callback) 75 def _resolve_special(self, view_type): 76 callback = getattr(self.urlconf_module, 'handler%s' % view_type) 77 mod_name, func_name = get_mod_func(callback) 95 78 try: 96 79 return getattr(__import__(mod_name, '', '', ['']), func_name), {} 97 80 except (ImportError, AttributeError), e: 98 raise ViewDoesNotExist, "Tried %s. Error was: %s" % (self.callback, str(e)) 81 raise ViewDoesNotExist, "Tried %s. Error was: %s" % (callback, str(e)) 82 83 def resolve404(self): 84 return self._resolve_special('404') 85 86 def resolve500(self): 87 return self._resolve_special('500')
