[Django]-How to discriminate based on HTTP method in django urlpatterns

30πŸ‘

βœ…

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/.

πŸ‘€hellsgate

18πŸ‘

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)),
πŸ‘€Juri Pakaste

2πŸ‘

For Django 3.2 you can use require_http_methods

from django.views.decorators.http import require_http_methods

@require_http_methods(["GET", "POST"])
def my_view(request):
    # I can assume now that only GET or POST requests make it this far
    # ...
    pass

See https://docs.djangoproject.com/en/3.2/topics/http/decorators/#django.views.decorators.http.require_http_methods for details

πŸ‘€Kim Stacks

Leave a comment