here's my crutch (just for the idea illustrating):
pre-pre-pre-alpha :)
settins.py
MIDDLEWARE_CLASSES = (
'middleware.handlers.Handler', # only first. it's posthandler
processor builder
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'middleware.handlers.HandlerProcessor', # posthandlers processor
)
middleware.handlers:
class HandlerProcessor(object):
def process_request(self, request, *args, **kwargs):
pass
def process_view(self, request, view_func, view_args,
view_kwargs):
# pops handlers list
while len(Handler.handlers) > 0:
name = Handler.handlers.pop()
if name in dir(Handler) and callable(getattr(Handler,
name)):
call = 'Handler.'+name+'(request)'
try:
result = eval(call)
if not result == None:
return result
except Exception, ex:
return HttpResponseRedirect('/500.html')
else:
return HttpResponseRedirect('/500.html')
class Handler(object):
def process_request(self, request, *args, **kwargs):
self.__class__.handlers = []
def add_handler(self, handler):
self.__class__.handlers.append(handler)
def process_view(self, request, view_func, view_args,
view_kwargs):
# this method check
ch = re.compile(r'^hnd_(.*)$')
for hname in view_kwargs:
hl = ch.findall(hname)
if len(hl) > 0:
# if you need, save view_kwargs[hname] values (it's
params for this handler)
self.add_handler(hl[0])
# dont forget del view_kwargs[hname]
''' add your handlers here:
def myHandler(self, request, *args, **kwargs):
if smth_wrong():
return HttpResponseRedirect('/a_bad_result_page.html') #
for example
'''
def LoginRequired(self, request, *args, **kwargs):
if user is not logged in:
return HttpResponseRedirect('/login.html')
def PermissionRequired(self, request, *args, **kwargs):
# check permissions for access to '^members/account/' area
pass
in urls.py
(r'^members/', include('members.urls'), {'hnd_LoginRequired':{}}),
in members/urls.py
(r'^account/', include('members.account.urls'), {
'hnd_PermissionRequired':{
'handler_arg_name1':'handler_value1',
'handler_arg_name2':'handler_value2',
},
'view_arg_name1':'view_value1',
'view_arg_name2':'view_value2',
}
),
something like this.. :)