Django-fr

Forum

#1 20-04-2012 10:39:26

sushi
Membre
Inscription : 17-04-2012
Messages : 9

[Résolu]AJAX pur + CSRF

Bonjour,

J'ai enfin réussi à exécuter mon script ajax dans mon projet.

Le problème est que le serveur répond bien à ma requête mais me renvoie une erreur 500.

J'ai vérifié qu'il n'y avait aucune erreur en accédant directement à l'url de ma vue réceptionnant le code AJAX et aucune erreur est affiché la vue agit correctement!

Je n'en suis pas sûr mais je pense qu'il y a un problème avec mon jeton CSRF, le problème est que je n'ai pas accès au contenu HTML renvoyé (je suppose) par django avec l'erreur 500!

Voici donc mon code javascript:
function verif(Read_Data)
{
    var xhr=new XMLHttpRequest();
    var nom=document.getElementById('input_nom');
    valeur=nom.value;
   
    xhr.onreadystatechange = function()
    {
        if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0) )
        {
            Read_Data(xhr.responseText);
        }
    };
    valeur=encodeURIComponent(valeur);
    xhr.open("POST","../validation",true);
    //xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.setRequestHeader("X-CSRFToken", "#csrfmiddlewaretoken");
    xhr.send("nom_user="+valeur);
}

function readData(readData)
{
    alert(readData);
}

Je tiens a précisé encore une fois, j'ai bien tester mon code javascript et il fonctionne (il n'y a rien dans readData mais le serveur à bien répondu et le alert s'affiche (avec rien dedans bien entendu).
Mon fichier javascript est static, j'ai configuré mes setting et mes url correctement et j'ai bien accès à mon JS (vérification via fireDebug).

Voici le code de ma vue:

def validation(request):
    if request.is_ajax() and request.method == 'POST':
        name_user=request.POST['name_user']
        if User.objects.filter(username=name_user):
            return HttpResponse("memepseudo")
        else:
            return HttpResponse("OK")
    else:
        return HttpResponse("erreur")

J'ai testé si ma vue s'éxécuter correctement en accèdant directement à l'url via mon navigateur sans passé par de l'ajax et ça m'affiche erreur (ce qui est tout à fait normal!).

J'ai essayé d'écouter le port 8000 via netcat pour récupérer le code html renvoyé par django mais ça ne fonctionne pas!

En espérant que vous puissiez m'aider,

cordialement,

sushi

[EDIT]Je tiens à faire une requête POST!

[EDIT] j'ai fait des tests avec la méthode GET et ça marche il y bel et bien un problème avec POST!

Dernière modification par sushi (21-04-2012 00:57:33)

Hors ligne

#2 20-04-2012 22:13:41

Julien Bouquillon [revolunet]
Membre
Inscription : 07-10-2011
Messages : 22

Re : [Résolu]AJAX pur + CSRF

Salut

Déjà pour voir le contenu de l'ajax qui transite, il te suffit d'utiliser
Firebug pour Firefox ou le debugger chrome intégré et l'onglet 'network'.
tu peux voir chaque requête qui passe, les parametres envoyées... et la
réponse associée; c'est indispensable.

Pour le javascript, tu devrais vraiment utiliser un framework qui te
simplifiera la vie (encodage, callbacks, cross-browser, selectors...). Le
plus simple et standard c'est jQuery mais il y en a plein d'autres;
indispensable aussi.

le jeton csrf il faut que tu le mettes manuellement dans ton template, et
il sera ajouté dans un champ hidden qui aura comme name
"csrfmiddlewaretoken". tu peux récupérer la valeur de ce champ et l'inclure
dans tes requetes ajax

Un petit exemple jquery qui fonctionne :

var data = {
    email: $('#email').val(),
    password: $('#password').val(),
    csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val()
};

$.post('/api/login', data, null, 'json').success(function(data, status,
xqhr) {
    if (data.success === true) {
        document.location = '/home';
    } else {
      alert(data.error || "Impossible de vous authentifier");
    }
});

En général quand on fait de l'ajax, les vues répondent en json

hope this helps smile

Julien


Le 20 avril 2012 11:39, sushi <sushisnet _AT_ gmail.com> a écrit :

> Bonjour,
>
> J'ai enfin réussi à exécuter mon script ajax dans mon projet.
>
> Le problème est que le serveur répond bien à ma requête mais me
> renvoie une erreur 500.
>
> J'ai vérifié qu'il n'y avait aucune erreur en accédant directement à
> l'url de ma vue réceptionnant le code AJAX et aucune erreur est affiché
> la vue agit correctement!
>
> Je n'en suis pas sûr mais je pense qu'il y a un problème avec mon jeton
> CSRF, le problème est que je n'ai pas accès au contenu HTML renvoyé (je
> suppose) par django avec l'erreur 500!
>
> Voici donc mon code javascript:
>
> function verif(Read_Data)
> {
>        var xhr=new XMLHttpRequest();
>        var nom=document.getElementById('input_nom');
>
>        xhr.onreadystatechange = function()
>        {
>                if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status
> == 0) )
>                {
>                        Read_Data(xhr.responseText);
>                }
>        };
>
>        xhr.open("POST","../validation",true);
>        xhr.setRequestHeader("X-CSRFToken", "#csrfmiddlewaretoken");
>        valeur=encodeURIComponent(nom.value);
>        xhr.send("name_user="+valeur);
> }
>
> function readData(readData)
> {
>        var toto;
>        alert(readData);
> }
>
> Je tiens a précisé encore une fois, j'ai bien tester mon code javascript
> et il fonctionne (il n'y a rien dans readData mais le serveur à bien
> répondu et le alert s'affiche (avec rien dedans bien entendu).
> Mon fichier javascript est static, j'ai configuré mes setting et mes url
> correctement et j'ai bien accès à mon JS (vérification via fireDebug).
>
> Voici le code de ma vue:
>
> def validation(request):
>        if request.is_ajax() and request.method == 'POST':
>                name_user=request.POST['name_user']
>                if User.objects.filter(username=name_user):
>                        return HttpResponse("memepseudo")
>                else:
>                        return HttpResponse("OK")
>        else:
>                return HttpResponse("erreur")
>
> J'ai testé si ma vue s'éxécuter correctement en accèdant directement
> à l'url via mon navigateur sans passé par de l'ajax et ça m'affiche
> erreur (ce qui est tout à fait normal!).
>
> J'ai essayé d'écouter le port 8000 via netcat pour récupérer le code
> html renvoyé par django mais ça ne fonctionne pas!
>
> En espérant que vous puissiez m'aider,
>
> cordialement,
>
> sushi
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#3 21-04-2012 00:57:16

sushi
Membre
Inscription : 17-04-2012
Messages : 9

Re : [Résolu]AJAX pur + CSRF

Merci bien, grâce à firedebug j'ai pu accèder au corps de la réponse (le code html de l'erreur HTML) et j'ai pu me rendre compte que j'avais simplement oublier un / à la fin de mon URL!!!

Ensuite, le serveur renvoie une erreur 403 qui est dû à la nom présence du jeton CSRF, d'après votre exemple j'ai modifié mon code qui marche (il n'agit pas comme je veux mais ça provient de ma vue):

function verif(Read_Data)
{
    var xhr=new XMLHttpRequest();
    var nom=document.getElementById('input_nom');
    valeur=nom.value;
   
    var form= document.getElementById("form_inscrp");
    var csrfmiddlewaretoken = form.childNodes[1].childNodes[0].value;
    xhr.onreadystatechange = function()
    {
        if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0) )
        {
            Read_Data(xhr.responseText);
        }
    };
    valeur=encodeURIComponent(valeur);
    xhr.open("POST","../validation/",true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.setRequestHeader("X-CSRFToken", "#csrfmiddlewaretoken");
    xhr.send("csrfmiddlewaretoken="+csrfmiddlewaretoken+"&nom_user="+valeur);
}

function readData(readData)
{
    alert(readData);
}

Merci pour votre aide!

Hors ligne

#4 21-04-2012 10:41:24

M. Namgyal Brisson
Membre
Inscription : 07-03-2012
Messages : 8

Re : [Résolu]AJAX pur + CSRF

Bonjour,

Lorsque je fais des requetes ajax j encode cote vue (python) en json. En
esperant que cela t aide
Le 20 avr. 2012 11:40, "sushi" <sushisnet _AT_ gmail.com> a écrit :

> Bonjour,
>
> J'ai enfin réussi à exécuter mon script ajax dans mon projet.
>
> Le problème est que le serveur répond bien à ma requête mais me
> renvoie une erreur 500.
>
> J'ai vérifié qu'il n'y avait aucune erreur en accédant directement à
> l'url de ma vue réceptionnant le code AJAX et aucune erreur est affiché
> la vue agit correctement!
>
> Je n'en suis pas sûr mais je pense qu'il y a un problème avec mon jeton
> CSRF, le problème est que je n'ai pas accès au contenu HTML renvoyé (je
> suppose) par django avec l'erreur 500!
>
> Voici donc mon code javascript:
>
> function verif(Read_Data)
> {
>        var xhr=new XMLHttpRequest();
>        var nom=document.getElementById('input_nom');
>
>        xhr.onreadystatechange = function()
>        {
>                if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status
> == 0) )
>                {
>                        Read_Data(xhr.responseText);
>                }
>        };
>
>        xhr.open("POST","../validation",true);
>        xhr.setRequestHeader("X-CSRFToken", "#csrfmiddlewaretoken");
>        valeur=encodeURIComponent(nom.value);
>        xhr.send("name_user="+valeur);
> }
>
> function readData(readData)
> {
>        var toto;
>        alert(readData);
> }
>
> Je tiens a précisé encore une fois, j'ai bien tester mon code javascript
> et il fonctionne (il n'y a rien dans readData mais le serveur à bien
> répondu et le alert s'affiche (avec rien dedans bien entendu).
> Mon fichier javascript est static, j'ai configuré mes setting et mes url
> correctement et j'ai bien accès à mon JS (vérification via fireDebug).
>
> Voici le code de ma vue:
>
> def validation(request):
>        if request.is_ajax() and request.method == 'POST':
>                name_user=request.POST['name_user']
>                if User.objects.filter(username=name_user):
>                        return HttpResponse("memepseudo")
>                else:
>                        return HttpResponse("OK")
>        else:
>                return HttpResponse("erreur")
>
> J'ai testé si ma vue s'éxécuter correctement en accèdant directement
> à l'url via mon navigateur sans passé par de l'ajax et ça m'affiche
> erreur (ce qui est tout à fait normal!).
>
> J'ai essayé d'écouter le port 8000 via netcat pour récupérer le code
> html renvoyé par django mais ça ne fonctionne pas!
>
> En espérant que vous puissiez m'aider,
>
> cordialement,
>
> sushi
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

Pied de page des forums