Skip to content

Instantly share code, notes, and snippets.

@joaodubas
Forked from henriquebastos/route.py
Created November 8, 2011 18:44
Show Gist options
  • Save joaodubas/1348695 to your computer and use it in GitHub Desktop.
Save joaodubas/1348695 to your computer and use it in GitHub Desktop.
Route is a better urls function, consider all Http verbs, and return 405 (NotAllowed) with the list of proper methods
# -*- encoding: utf-8 -*-
# Usage:
# urlpatterns += patterns('',
# route(r'^$', GET='getview', POST='postview', PUT='putview', DELETE='deleteview', name='viewname'),
# )
#
from django.http import HttpResponseNotAllowed
from django.core.urlresolvers import RegexURLPattern, get_callable
def discover_view(view, prefix=''):
if isinstance(view, basestring):
if not view:
raise ValueError('View name is required to discover the callable')
if prefix:
view = prefix + '.' + view
return get_callable(view)
else:
return view
HTTP_VERBS = ('GET', 'POST', 'PUT', 'DELETE')
class ViewByMethod(object):
def __init__(self, **kwargs):
for method in HTTP_VERBS:
self.__setattr__(method, kwargs.pop(method, None))
def __call__(self, request, *args, **kwargs):
if request.method in HTTP_VERBS and self.__getattribute__(request.method):
return self.__getattribute__(request.method)(request, *args, **kwargs)
return HttpResponseNotAllowed([verb for verb in dir(self) if verb in HTTP_VERBS and self.__getattribute__(verb)])
class RegexUrlPatternByMethod(RegexURLPattern):
def __init__(self, regex, GET=None, POST=None, PUT=None, DELETE=None, default_args=None, name=None):
super(RegexUrlPatternByMethod, self).__init__(regex, '', default_args, name)
self.GET = GET
self.POST = POST
self.PUT = PUT
self.DELETE = DELETE
def add_prefix(self, prefix):
self.prefix = prefix
def _get_callback(self):
kwargs = {}
for method in HTTP_VERBS:
kwargs[method] = discover_view(self.__getattribute__(method), self.prefix)
return ViewByMethod(**kwargs)
callback = property(_get_callback)
def route(regex, GET=None, POST=None, PUT=None, DELETE=None, kwargs=None, name=None, prefix=''):
return RegexUrlPatternByMethod(regex, GET, POST, PUT, DELETE, kwargs, name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment