How do I send empty response in Django without templates

I have written a view which responds to ajax requests from browser. It's written like so -

@login_required
def no_response(request):
    params = request.has_key("params")
    if params:
        # do processing
        var = RequestContext(request, {vars})
        return render_to_response('some_template.html', var)
    else: #some error
        # I want to send an empty string so that the 
        # client-side javascript can display some error string. 
        return render_to_response("") #this throws an error without a template.

How do i do it?

Here's how I handle the server response on client-side -

    $.ajax
    ({
        type     : "GET",
        url      : url_sr,
        dataType : "html",
        cache    : false,
        success  : function(response)
        {
            if(response)
                $("#resp").html(response);
            else
                $("#resp").html("<div id='no'>No data</div>");
        }
    });

Solution 1:

render_to_response is a shortcut specifically for rendering a template. If you don't want to do that, just return an empty HttpResponse:

 from django.http import HttpResponse
 return HttpResponse('')

However, in this circumstance I wouldn't do that - you're signalling to the AJAX that there was an error, so you should return an error response, possibly code 400 - which you can do by using HttpResponseBadRequest instead.

Solution 2:

I think the best code to return an empty response is 204 No Content.

from django.http import HttpResponse
return HttpResponse(status=204)

However, in your case, you should not return an empty response, since 204 means: The server *successfully* processed the request and is not returning any content..

It is better returning some 4xx status code to better signal the error is in the client side. Yo can put any string in the body of the 4xx response, but I highly recommend you send a JSONResponse:

from django.http import JsonResponse
return JsonResponse({'error':'something bad'},status=400)