57 votes

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

J'ai écrit une vue qui répond aux requêtes ajax du navigateur. C'est écrit ainsi -

@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 dois-je faire ?

Voici comment je gère la réponse du serveur du 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>");
        }
    });

88voto

Daniel Roseman Points 199743

render_to_response est un raccourci spécifique pour le rendu d'un modèle. Si vous ne voulez pas faire cela, il suffit de retourner un fichier vide HttpResponse :

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

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

53voto

robermorales Points 1267

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

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

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

Il est préférable de renvoyer certains 4xx code d'état pour mieux signaler que l'erreur est du côté client . Vous pouvez mettre n'importe quelle chaîne de caractères dans le corps de la balise 4xx réponse, mais je vous recommande vivement d'envoyer un JSONResponse :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X