def subclass_view(self, request, path): """ Forward any request to a custom view of the real admin. """ ct_id = int(request.GET.get('ct_id', 0)) if not ct_id: # See if the path started with an ID. try: pos = path.find('/') if pos == -1: object_id = long(path) else: object_id = long(path[0:pos]) except ValueError: raise Http404("No ct_id parameter, unable to find admin subclass for path '{0}'.".format(path)) ct_id = self.model.objects.values_list('polymorphic_ctype_id', flat=True).get(pk=object_id) real_admin = self._get_real_admin_by_ct(ct_id) resolver = RegexURLResolver('^', real_admin.urls) resolvermatch = resolver.resolve(path) # May raise Resolver404 if not resolvermatch: raise Http404("No match for path '{0}' in admin subclass.".format(path)) return resolvermatch.func(request, *resolvermatch.args, **resolvermatch.kwargs)
def register_url_resolver(self, app): # Install module URL resolver # @todo: Legacy django part? try: mod_resolver = self.urlresolvers[app.module, None] except KeyError: mod_resolver = [] self.urlpatterns += [ RegexURLResolver("^%s/" % app.module, mod_resolver, namespace=app.module) ] self.urlresolvers[app.module, None] = mod_resolver # Install application URL resolver try: app_resolver = self.urlresolvers[app.module, app.app] except KeyError: app_resolver = [] mod_resolver += [ RegexURLResolver("^%s/" % app.app, app_resolver, namespace=app.app) ] self.urlresolvers[app.module, app.app] = app_resolver return app_resolver
def make_url_resolver(regex, urlpatterns): try: # Django 2.0 from django.urls.resolvers import RegexPattern return RegexURLResolver(RegexPattern(regex), urlpatterns) except ImportError: # Django < 2.0 return RegexURLResolver(regex, urlpatterns)
def system_urls(request): urlconf = settings.ROOT_URLCONF urls_dict = RegexURLResolver(r'^/', urlconf).reverse_dict urls = {} for k in urls_dict: if type(k) == str: if str(k) in system.WEJUDGE_URLS_EXPORT_EXCEPT: continue v = urls_dict.getlist(k) urls[k] = v return JsonResponse(WeJudgeResult(urls).to_dict())
def url(regex, view, kwargs=None, name=None): if isinstance(view, (list, tuple)): # For include(...) processing. urlconf_module, app_name, namespace = view return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace) elif callable(view): return RegexURLPattern(regex, view, kwargs, name) else: raise TypeError('view must be a callable or a list/tuple in the case of include().')
class ErrorHandlerResolutionTests(SimpleTestCase): """Tests for handler400, handler404 and handler500""" def setUp(self): urlconf = 'urlpatterns_reverse.urls_error_handlers' urlconf_callables = 'urlpatterns_reverse.urls_error_handlers_callables' self.resolver = RegexURLResolver(r'^$', urlconf) self.callable_resolver = RegexURLResolver(r'^$', urlconf_callables) def test_named_handlers(self): handler = (empty_view, {}) self.assertEqual(self.resolver.resolve_error_handler(400), handler) self.assertEqual(self.resolver.resolve_error_handler(404), handler) self.assertEqual(self.resolver.resolve_error_handler(500), handler) def test_callable_handlers(self): handler = (empty_view, {}) self.assertEqual(self.callable_resolver.resolve_error_handler(400), handler) self.assertEqual(self.callable_resolver.resolve_error_handler(404), handler) self.assertEqual(self.callable_resolver.resolve_error_handler(500), handler)
def test_no_urls_exception(self): """ RegexURLResolver should raise an exception when no urlpatterns exist. """ resolver = RegexURLResolver(r'^$', settings.ROOT_URLCONF) with self.assertRaisesMessage( ImproperlyConfigured, "The included URLconf 'urlpatterns_reverse.no_urls' does not " "appear to have any patterns in it. If you see valid patterns in " "the file then the issue is probably caused by a circular import." ): getattr(resolver, 'url_patterns')
def url(regex, view, kwargs=None, name=None): # 看到了吧 如果第二个参数是元组 也就是我们使用include()的情况! if isinstance(view, (list, tuple)): # For include(...) processing. urlconf_module, app_name, namespace = view # 和上面那个locale什么什么一样 # 我们也把这个名字很长的类放到后面单独开第二弹去讲 return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace) elif callable(view): # 如果view是一个可调用对象 # 也就是对应了视图函数 # 不在话下 把函数和正则表达式对应起来! return RegexURLPattern(regex, view, kwargs, name) else: raise TypeError('view must be a callable or a list/tuple in the case of include().')
def setUp(self): urlconf = 'urlpatterns_reverse.urls_error_handlers' urlconf_callables = 'urlpatterns_reverse.urls_error_handlers_callables' self.resolver = RegexURLResolver(r'^$', urlconf) self.callable_resolver = RegexURLResolver(r'^$', urlconf_callables)
def resolve_path(path): return RegexURLResolver( r'^', 'corehq.apps.app_manager.download_urls').resolve(path)
def setUp(self): urlconf = "urlpatterns_reverse.urls_error_handlers" urlconf_callables = "urlpatterns_reverse.urls_error_handlers_callables" self.resolver = RegexURLResolver(r"^$", urlconf) self.callable_resolver = RegexURLResolver(r"^$", urlconf_callables)