how to discriminate based on HTTP method in django urlpatterns
Because Django allows you to use callables in url config, you can do it with a helper function.
def method_dispatch(**table):
def invalid_method(request, *args, **kwargs):
logger.warning('Method Not Allowed (%s): %s', request.method, request.path,
extra={
'status_code': 405,
'request': request
}
)
return HttpResponseNotAllowed(table.keys())
def d(request, *args, **kwargs):
handler = table.get(request.method, invalid_method)
return handler(request, *args, **kwargs)
return d
To use it:
url(r'^foo',
method_dispatch(POST = post_handler,
GET = get_handler)),
I don't think you can do this with different functions without adding a bunch of logic to the URL (which is never a good idea), but you can check inside the function for the request method:
def myview(request):
if request.method == 'GET':
# Code for GET requests
elif request.method == 'POST':
# Code for POST requests
You could also switch to class-based views. You would then only need to define a method for each of the HTTP methods:
class CreateMyModelView(CreateView):
def get(self, request, *args, **kwargs):
# Code for GET requests
def post(self, request, *args, **kwargs):
# Code for POST requests
If you decide to go the class-based route, another good resource is http://ccbv.co.uk/.