# views.py file import inspect from django.http import Http404, HttpResponse, HttpResponseRedirect class BaseController(object): def __call__(self, request, url): parts = url.rstrip("/").split('/') try: view = parts.pop(0) except IndexError: raise Http404 if view == "": view = "index" arg_count = len(parts) if hasattr(self, view): view_func = getattr(self, view) if callable(view_func): argspec = inspect.getargspec(view_func) func_arg_count = len(argspec[0]) - 2 # minus self, request if func_arg_count > arg_count: if argspec[3] is not None: default_count = len(argspec[3]) diff = func_arg_count - arg_count if diff <= default_count: parts = self.convert_args(view_func, parts) return view_func(request, *parts) raise Http404 elif func_arg_count == arg_count: parts = self.convert_args(view_func, parts) return view_func(request, *parts) raise Http404 class MyController(BaseController): def index(self, request): return HttpResponse("Index") def help(self, request, slug=None): if not slug: return HttpResponse("Help Index") else: return HttpResponse("Slug") # in urls.py from my_app.views import MyController urlpatterns = patterns('', url(r'^(.*)', MyController(), name='controller'), )