Requète POST AJAX sur Django

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J’essaie depuis maintenant quelques heure d'envoyer une simple requête POST en Ajax depuis un template Django mais rien a faire je n'y comprend rien… Toujours cet erreur interne…

Est-ce que quelqu'un pourrait me guider?

template

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<script type="text/javascript">
// Code jQuery Ici
    $(document).ready(function(){
        updateDisplayForm();

        // Form POST AJAX
        $(".form").submit( function() {
            var donnees = $(this).serialize();
            $.ajax({
                type: 'POST',
                url: "/businessCanvas/addElement",
                data: donnees,

                success: function(data) {
                    alert('success');
                },
                error: function(resultat, status, erreur) {
                    alert(resultat + status + erreur);
                }
            });
            return false;
        });
    });
</script>

...
...
...

<form class="form" id="KeyPartner" action="" method="post">{% csrf_token %}
                        Title : <input type="text" name="title" value=""/><br/>
                        Comment : <input type="text" name="comment" value=""/><br/>
                        <input type="submit" value="Envoyer"/>
                    </form>

urls.py

1
url(r'^addElement/$', views.addElement, name='addElement'),

views.py

1
2
3
4
5
def addElement(request):
    return HttpResponse(
            json.dumps({"nothing to see": "this isn't happening"}),
            content_type="application/json"
    )
+0 -0

Bah j'aimerai bien justement mais mon alert() ne m'affiche que "erreur interne". Sinon j'aurais au moins pu guider mes recherche sus internet mais la je piétine!

Tout ce que je sais c'est que j'arrive bien dans mon urls.py car quand je commente la ligne de ma vue dans cet urls.py l'erreur ce transforme en "not found"

+0 -0

Tu utilise quelle version de Django ?

Tu peux pas rajouter des logs ?

Aussi, pour le moment, ta vue ne check pas le "POST" de la requete. Active le mode debug et va consulter à la main la vue dans ton navigateur, tu aura peut être plus de détail !

Mon pip freeze me dit : Django==1.8

Concernant les logs j'ai regarder dans cette direction mais apparement Django ne les prend pas en compte directements… Les logs apache de Wamp eux ne couvre pas le problème apparement car il n'affiche rien.

Ma vue ne check pas le "POST" de manière a éviter de tout combattre de front, j'ai donc vidé la vue de manière a me concentre sur une requète ajax qui ne fait rien mais qui marcherai déjà…

Si je consulte ma vue a la main sans requète post, elle m'affiche bien:

1
{"nothing to see": "this isn't happening"}

En fait c'est ma première requète post en ajax, et mes début en Django… Je suis vraiment perturber par cette requète pourtant simple…

+0 -0

Si je consulte ma vue a la main sans requète post, elle m'affiche bien:

Il est donc plus probable que ce soit coté JS le problème puisque ta vue semble retourner le bon contenu. Pour être sûrs (et puisque tu es sur Django >= 1.7) tu devrais utiliser JsonReponse pour assurer à 100% que tout est bon coté Django.

Je pense alors que le problème viens du coté JS et donc là je ne pourrais pas t'aider malheureusement, je ne connais pas JQuery

D'accord je vient donc de modifier:

views.py

1
2
3
4
from django.http import JsonResponse

def addElement(request):
    return JsonResponse({'foo':'bar'})

C'est gentil d'avoir pris le temps de m'aider, espérons que quelqu'un d'autre aura une solution concernant l'ajax!

+0 -0

Petite question idiote, quand tu as testé "à la main" dans ton navigateur, tu as visité /businessCanvas/addElement ou /businessCanvas/addElement/ ? Parce que ton code JS utilise le premier et ton url.py référence le deuxième. Je ne suis pas un pro de Django et donc peut être qu'il accepte les deux de manière transparente (je pense que oui) mais on est jamais sûrs de rien…

Je ne suis pas un pro de Django et donc peut être qu'il accepte les deux de manière transparente (je pense que oui) mais on est jamais sûrs de rien…

Kje

En effet je l'ai paramétré de manière a ce qu'il complète automatiquement au besoin. Mais c'est toujours mieux de soulever les petites choses au cas ou! Surtout vu le peu de code ici…

+0 -0

Oula! Je ne connaissais pas du tout cet outils!

Un alert directement dans le code:

1
csrfmiddlewaretoken=vmHYrVba98b1BrVYXqX140NnVah01a5M&title=toto&comment=toto

On n'y vois bien le token Django ainsi que mes deux variable du form.

Dans la console Javascript:

1
2
print(donnees);
ReferenceError: donnees is not defined

Je pense que les variable doivent être supprimer juste après l'appel de la fonction submit. Ce qui expliquerai l’échec de l'appel depuis la console.

+0 -0

Et ben merci Kje parce que tu ma fait découvrir l'outil qui sauve!!

Grâce a l'outil réseau de la console du browser j'ai pu suivre et examiner mes entête HTTP et surtout les réponses quand elles arriver.

  • L'erreur venais bien du slash en fin d'url dans mon Ajax. (Problème propre au requète HTTP même si ça marche pour les redirections simple)
  • Une autre erreur est survenu me disant qu'il y avais un problème de jeton CSRF.

Le problème de jeton en ajax sur Django est décrit ici sur stackoverflow

Il suffit de rajouter ce morceau de code en haut de sa page pour ajouter le jeton CSRF dans notre header HTTP:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$(function () {
    $.ajaxSetup({
        headers: { "X-CSRFToken": getCookie("csrftoken") }
    });
});

function getCookie(c_name)
{
    if (document.cookie.length > 0)
    {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1)
        {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) c_end = document.cookie.length;
            return unescape(document.cookie.substring(c_start,c_end));
        }
    }
    return "";
 }

Bien entendu il faut au minimum avoir activé les jetons CSRF dans votre middleware, mais cela est configuré par défaut dans votre settings.py normalement.

+1 -0

Wisdom of the ancients

Et oui, il faut le répéter, marteler, …

Quand vous travaillez avec une API REST. Utilisez :

  • la console de votre navigateur et spécialement l'onglet "Réseau" pour voir le détail des requêtes et réponses http

  • une extension du type "POSTMAN" qui permet facilement d'exécuter des requêtes avec la méthode HTTP voulue, les headers voulus, … Sans passer par le code client (ce qui vous permet de savoir d'où provient l'erreur).

  • Mettez en place un maximum de tests automatiques (des scripts) qui vont tester chaque point d'entrée de votre API (à travers le réseau, c'est encore mieux) avec tous les paramètres possibles et imaginables, et testez non seulement les comportements standard (ajout d'une ressource, récupération d'une ressource) mais aussi tous les comportements d'erreur (notamment ceux correspondant au code HTTP suivant : 400, 401, 403, 404) en injectant par exemple des données foireuses, etc. Vérifiez que le code est bon, et que le statut http (ou le contenu de la réponse) fournit des informations claires à l'utilisateur (par exemple dans le cas d'une erreur 400 : qu'est-ce-que vous n'avez pas compris dans la requête envoyée, pour une 401, fournissez l'URL de login, pour une 403 dîtes lui que l'accès à cette ressource est interdit, …).

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte