views:

77

answers:

2

It's clear how to create a URLPattern which dispatches from a URL regex:

(r'^books/$', books),

where books can further dispatch on request method:

def books(request):
    if request.method == 'POST':
        ...
    else:
        ...

I'd like to know if there is an idiomatic way to include the request method inside the URLPattern, keeping all dispatch/route information in a single location, such as:

(r'^books/$', GET, retrieve-book),
(r'^books/$', POST, update-books),
(r'^books/$', PUT, create-books),
+2  A: 

The reason it's done as a single view method is that you're usually rendering some kind of page content as context for the form you're about to submit.

Anyway, my reason for replying it this: from your sample URLConf there it looks like you're building a REST webservice with Django -- if this is the case, you might really benefit from using the rather good django-piston to automatically create your resources/collections. It uses class-based handlers that automatically redirect to the appropriate method (get-books, update-books, create-books in your case) based on the HTTP method in the request

stevejalim
PS - don't want to start a bun-fight, but in my opinion POST should go to 'create' and PUT should go to 'update' based on the HTTP 1.1 spec (and this is also the way things are done in django-piston)
stevejalim
A: 

Standard Django doesn't have any mechanism for differentiating request methods besides what you used in your second snippet:

if request.method == 'POST':
    ...

However, there are third-party apps and snippets that attempt to make method handling a little cleaner using class based views. See, for example, this snippet (found from this SO question about class views).

Personally I'm not so sure this is a good idea. The standard Django method is so... standard... that I think this introduces extra confusion and complexity where it really isn't needed.

Van Gale