web-dev-qa-db-fra.com

Comment envoyer une réponse vide dans Django sans modèles

J'ai écrit une vue qui répond aux demandes ajax du navigateur. C'est écrit comme ça -

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

Comment fait-on ça?

Voici comment je gère la réponse du serveur côté client -

    $.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>");
        }
    });
44

render_to_response est un raccourci spécialement conçu pour le rendu d'un modèle. Si vous ne voulez pas faire cela, renvoyez simplement un HttpResponse vide:

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

Cependant, dans ce cas, je ne ferais pas cela - vous signalez au AJAX qu'il y a eu une erreur, vous devez donc renvoyer une réponse d'erreur, éventuellement le code 400 - que vous pouvez faire en utilisant HttpResponseBadRequest à la place.

74
Daniel Roseman

Je pense que le meilleur code pour renvoyer une réponse vide est 204 No Content.

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

Cependant, dans votre cas, vous ne devez pas retourner une réponse vide, car 204 signifie: The server *successfully* processed the request and is not returning any content. .

Il vaut mieux en retourner 4xx le code d'état pour mieux signaler l'erreur est côté client . Vous pouvez mettre n'importe quelle chaîne dans le corps du 4xx réponse, mais je vous recommande fortement d'envoyer un JSONResponse:

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