Skip to main content

A drop-in replacement for django.conf.urls.defaults which supports HTTP verb dispatch and view wrapping.

Project description

django-reroute is a drop-in replacement for django.conf.urls.defaults that supports HTTP verb dispatch and view wrapping.

Download

Github: http://github.com/dnerdy/django-reroute

easy_install:

easy_install django-reroute

Source:

# Download the source and run
python setup.py install

Adding django-reroute to your project

django-reroute is a drop-in replacement for django.conf.urls.defaults:

# Replace
from django.conf.urls.defaults *

# with
from reroute import *

Although it’s better to be explicit:

# Replace
from django.conf.urls.defaults import handler404, handler500, patterns, url, include

# with
from reroute import handler404, handler500, patterns, url, include

HTTP verb dispatching

verb_url patterns can match HTTP verbs in addition to regexes:

from reroute.verbs import verb_url

urlpatterns = patterns('myapp.views',
    url('^regular$', 'regular_old_view'),
    verb_url('GET', '^restful$', 'restful_view')
)

verb_url pattern regexes can be overloaded, enabling routing solely based on HTTP verb:

urlpatterns = patterns('myapp.views',
    verb_url('GET', '^restful$', 'restful_view'),
    verb_url('PUT', '^restful$', 'another_restful_view')
)

Restful resource example:

paychecks = patterns('myapp.views.employees.paychecks',
    verb_url('GET',     '^paychecks$', 'index_paychecks'),
    verb_url('POST',    '^paychecks$', 'add_paycheck'),
)

urlpatterns = patterns('myapp.views.employees',
    verb_url('GET',     '^employees$', 'index_employees'),
    verb_url('POST',    '^employees$', 'add_employee'),

    verb_url('GET',     '^employees/(?P<employee_id>\d+)$', 'show_employee')
    verb_url('PUT',     '^employees/(?P<employee_id>\d+)$', 'update_employee')
    verb_url('DELETE',  '^employees/(?P<employee_id>\d+)$', 'delete_employee'),

    url('^employees/(?P<employee_id>\d+)/', include(paychecks)),
)

Rerouting through wrappers

You can configure a list of view wrappers for a set of url patterns:

from reroute import reroute_patterns

def params_wrapper(view, request, *args, **kwargs):
    # Provide uniform access of GET, POST or PUT parameters
    # through request.PARAMS

    if request.method == 'POST':
        request.PARAMS = dict(request.POST.iteritems())
    else:
        request.PARAMS = dict(request.GET.iteritems())

    return view(request, *args, **kwargs)

urlpatterns = reroute_patterns([params_wrapper], 'myapp.views',
    verb_url('GET', '^restful$', 'restful_view'),
    verb_url('PUT', '^restful$', 'another_restful_view')
)

A wrapper is any callable that takes the arguments: view, request, *args, **kwargs:

class Wrapper(object):
    def __call__(self, view, request, *args, **kwargs):
        return view(request, *args, **kwargs)

urlpatterns = reroute_patterns([Wrapper()], 'myapp.views',
    verb_url('GET', '^restful$', 'restful_view'),
    verb_url('PUT', '^restful$', 'another_restful_view')
)

And you can even get fancy and create your own drop-in replacement for patterns:

from functools import partial
import logging

def wrapper_one(view, request, *args, **kwargs):
    logging.debug("wrapper one")
    return view(request, *args, **kwargs)

def wrapper_two(view, request, *args, **kwargs):
    logging.debug("wrapper two")
    return view(request, *args, **kwargs)

patterns = partial(reroute_patterns, [wrapper_one, wrapper_two])

urlpatterns = patterns('myapp.views',
    verb_url('GET', '^restful$', 'restful_view'),
    verb_url('PUT', '^restful$', 'another_restful_view')
)

Author

django-reroute was written by Mark Sandstrom.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-reroute-0.1.1.tar.gz (6.7 kB view details)

Uploaded Source

File details

Details for the file django-reroute-0.1.1.tar.gz.

File metadata

File hashes

Hashes for django-reroute-0.1.1.tar.gz
Algorithm Hash digest
SHA256 c957c10a31e64b063e50e038554e1cd62729cbd28659e37dec10948d85e753e9
MD5 f45b2ccae9e72a716facb3cc5b5f5c92
BLAKE2b-256 ef42c3b56176854c470d243c9d244e31101df8ab2896836f293dea1fef251b32

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page