# 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'),
)
Comments
I've posted a slightly improved version of this as snippet #1165 which doesn't break reverse URL resolving.
#
he means snippet #1204 :)
#