Simple views dispatcher by http methods

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from django.http import HttpResponseNotAllowed


def dispatch(**methods):
    """Calls a view by request.method value.

    To use this dispatcher write your urls.py like this:

    urlpatterns = pattern('',
        url(r'^foo/$', dispatch(head=callable1,
                                get=callable2,
                                delete=callable3)),
    )

    If request.method is equal to head, callable1 will be called as your usual view function;
    if it is "get", callable2 will be called; et cetera.
    If the method specified in request.method is not one handled by dispatch(..),
    HttpResponseNotAllowed is returned.
    """

    lc_methods = dict( (method.lower(), handler) for (method, handler) in methods.iteritems() )

    def __dispatch(request, *args, **kwargs):
        handler = lc_methods.get(request.method.lower())
        if handler:
            return handler(request, *args, **kwargs)
        else:
            return HttpResponseNotAllowed(m.upper() for m in lc_methods.keys())
    return __dispatch

More like this

  1. RestView - class for creating a view that dispatches based on request.method by simon 5 years, 7 months ago
  2. Base class for RESTful Views by jpwatts 5 years, 4 months ago
  3. Generic AJAX app by Rupe 4 years, 10 months ago
  4. View dispatch based on HTTP verb by malcolmt 6 years, 6 months ago
  5. Using class methods as views by panyam 4 years, 10 months ago

Comments

schinckel (on November 16, 2009):

I really like this. It always bothered me (with RESTful stuff, anyway) how the one handler does GET and PUT, etc.

#

(Forgotten your password?)