Django

Code

Changeset 411

Show
Ignore:
Timestamp:
08/05/05 15:50:19 (3 years ago)
Author:
adrian
Message:

Refactored the internals of URL parsing to use less code

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/conf/urls/defaults.py

    r3 r411  
    1 from django.core.urlresolvers import RegexURLMultiplePattern, RegexURLPattern 
     1from django.core.urlresolvers import RegexURLPattern, RegexURLResolver 
    22 
    33__all__ = ['handler404', 'handler500', 'include', 'patterns'] 
     
    1212    for t in tuples: 
    1313        if type(t[1]) == list: 
    14             pattern_list.append(RegexURLMultiplePattern(t[0], t[1][0])) 
     14            pattern_list.append(RegexURLResolver(t[0], t[1][0])) 
    1515        else: 
    1616            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  
    5252                return response 
    5353 
    54         conf_module = __import__(ROOT_URLCONF, '', '', ['']) 
    55         resolver = urlresolvers.RegexURLResolver(conf_module.urlpatterns) 
     54        resolver = urlresolvers.RegexURLResolver(r'^/', ROOT_URLCONF) 
    5655        try: 
    5756            callback, param_dict = resolver.resolve(path) 
     
    6665                return self.get_technical_error_response(is404=True) 
    6766            else: 
    68                 resolver = urlresolvers.Error404Resolver(conf_module.handler404) 
    69                 callback, param_dict = resolver.resolve() 
     67                callback, param_dict = resolver.resolve404() 
    7068                return callback(request, **param_dict) 
    7169        except db.DatabaseError: 
     
    7775                message = "%s\n\n%s" % (self._get_traceback(), request) 
    7876                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
    8078        except exceptions.PermissionDenied: 
    8179            return httpwrappers.HttpResponseForbidden('<h1>Permission denied</h1>') 
     
    9189                message = "%s\n\n%s" % (self._get_traceback(), request_repr) 
    9290                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
    9492 
    95     def get_friendly_error_response(self, request, conf_module): 
     93    def get_friendly_error_response(self, request, resolver): 
    9694        """ 
    9795        Returns an HttpResponse that displays a PUBLIC error message for a 
     
    9997        """ 
    10098        from django.core import urlresolvers 
    101         resolver = urlresolvers.Error404Resolver(conf_module.handler500) 
    102         callback, param_dict = resolver.resolve() 
     99        callback, param_dict = resolver.resolve500() 
    103100        return callback(request, **param_dict) 
    104101 
  • django/trunk/django/core/urlresolvers.py

    r357 r411  
    1919class RegexURLPattern: 
    2020    def __init__(self, regex, callback, default_args=None): 
    21         self.regex = re.compile(regex) 
     21        # regex is a string representing a regular expression. 
    2222        # callback is something like 'foo.views.news.stories.story_detail', 
    2323        # which represents the path to a module and a view function name. 
     24        self.regex = re.compile(regex) 
    2425        self.callback = callback 
    2526        self.default_args = default_args or {} 
    2627 
    27     def search(self, path): 
     28    def resolve(self, path): 
    2829        match = self.regex.search(path) 
    2930        if match: 
     
    4445            raise ViewDoesNotExist, "Tried %s in module %s. Error was: %s" % (func_name, mod_name, str(e)) 
    4546 
    46 class RegexURLMultiplePattern: 
    47     def __init__(self, regex, urlconf_module): 
     47class 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. 
    4851        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 
    5153 
    52     def search(self, path): 
     54    def resolve(self, path): 
    5355        match = self.regex.search(path) 
    5456        if match: 
    5557            new_path = path[match.end():] 
    56             try: # Lazily load self.url_patterns. 
    57                 self.url_patterns 
    58             except AttributeError: 
    59                 self.url_patterns = self.get_url_patterns() 
    6058            for pattern in self.url_patterns: 
    61                 sub_match = pattern.search(new_path) 
     59                sub_match = pattern.resolve(new_path) 
    6260                if sub_match: 
    6361                    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 
    6464 
    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) 
    6769 
    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_patterns 
     70    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) 
    7274 
    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) 
    9578        try: 
    9679            return getattr(__import__(mod_name, '', '', ['']), func_name), {} 
    9780        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')