开发者

How can you dispatch on request method in Django URLpatterns?

开发者 https://www.devze.com 2023-01-02 07:13 出处:网络
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:

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),


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

UPDATE (four years later!) while django-piston still exists (and works), Django REST Framework is a much more sophisticated, documented and extended choice these days.


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消