Django-fr

Forum

#1 17-02-2012 19:22:25

Mathieu
Membre
Inscription : 15-02-2012
Messages : 8

Erreur 403: CSRF verification failed.

Bonjour,

J'en suis à la page 4 du tutoriel.

J'ai mis en place le formulaire de soumission des votes. Malheureusement, quand je teste en cochant un radio-button puis en cliquant sur "vote", j'obtiens l'erreur suivante:

Forbidden (403)

CSRF verification failed. Request aborted.

Help

Reason given for failure:

    CSRF token missing or incorrect.
    

In general, this can occur when there is a genuine Cross Site Request Forgery, or when Django's CSRF mechanism has not been used correctly. For POST forms, you need to ensure:

    The view function uses RequestContext for the template, instead of Context.
    In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.
    If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.

You're seeing the help section of this page because you have DEBUG = True in your Django settings file. Change that to False, and only the initial error message will be displayed.

You can customize this page using the CSRF_FAILURE_VIEW setting.

Je précise que je me contente de copier/coller le code indiqué dans le tutoriel.

Quelqu'un voit-il d'où le problème vient ?

Dernière modification par Mathieu (18-02-2012 12:38:30)

Hors ligne

#2 17-02-2012 19:53:42

Vincent
Membre
Inscription : 08-08-2011
Messages : 20

Re : Erreur 403: CSRF verification failed.

Bonjour,

Il y a 3 choses dont tu dois t'assurer :

The view function uses RequestContext for the template, instead of Context.

Utiliser RequestContext et non juste Context dans ta vue.

In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.

Rajouter le tag csrf_token dans ton formulaire (template). Généralement c'est l'erreur la plus fréquente

If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.

Normalement tu utilise déjà ce middleware.

Hors ligne

#3 18-02-2012 02:53:24

Mathieu
Membre
Inscription : 15-02-2012
Messages : 8

Re : Erreur 403: CSRF verification failed.

Bonjour et merci pour ta réponse.

J'avais lu ces 3 pistes, mais en toute rigueur, le tutoriel semble ne suivre aucune de ces recommandations. Les codes présentés dans le tutoriel ne comprennent aucune référence directe à aucun moment à ces mots clefs:
- ni RequestContext ni Context dans la vue
- ni {% csrf_token %} dans le template

Les codes exemples sont détaillés ici.

J'ai malgré tout essayé la deuxième piste et j'ai ajouté le {% token csrf_token %} dans le template. Sans succès:

<h1>{{ poll.question }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="/polls/{{ poll.id }}/vote/" method="post">
{% csrf_token %}
{% for choice in poll.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

Bien que j'utilise Pinax et que j'ai donc très probablement le middleware installé, j'ai aussi suivi la troisième piste. J'ai ajouté {% csrf_protect %} dans les templates du formulaire et le template de destination après validation. Là encore, sans succès.

Je suis le bec dans l'eau. Le tutoriel a-t-il été modifié récemment ?

Dernière modification par Mathieu (18-02-2012 03:01:59)

Hors ligne

#4 18-02-2012 03:03:00

Julien Bouquillon
Membre
Inscription : 26-09-2011
Messages : 25

Re : Erreur 403: CSRF verification failed.

le tutorial que tu lis en FR est de la version 1.1.1 et on en est à la 1.3.
les csrf n'etaient pas implementés à l'epoque si je me souviens bien.

quel version de django utilises tu ?

tuto a jour en anglais : https://docs.djangoproject.com/en/1.3/contents/


Deux choses à verifier :

que le champs csrf_token est bien present dans les données que tu envoies
via le form (avec firebug ou web inspector)

si ce n'est pas le cas, verifier si tu as le csrf_token kkpart dans le code
source de la page générée auquel cas il serait simplement mal placé.

je ne connais pas pinax mais si tu es dans un environnement intranet tu
peux utiliser le decorateur @csrf_exempt pour désactiver la verification du
csrf sur une vue :
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt


my 2 cents

Julien

Le 18 février 2012 02:53, Endash <mathieu.lindemann _AT_ gmail.com> a écrit :

> Bonjour,
>
> J'avais lu ces 3 pistes, mais en toute rigueur, le tutoriel semble ne
> suivre aucune de ces recommandations. Lles codes présentés dans le
> tutoriel ne comprennent de toutes façons aucune référence à aucun
> moment à ces mots clefs:
> - ni RequestContext ni Context dans la vue
> - ni {% csrf_token %} dans le template
>
> Les codes exemples sont détaillés
> [url=
> http://docs.django-fr.org/intro/tutorial04.html#intro-tutorial04]ici[/url
> ].
>
> Il me reste la troisième piste, celle du middleware. Mais comme j'utilise
> Pinax, je pense que cette piste peut-être exclue.
>
> Je suis le bec dans l'eau.
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#5 18-02-2012 03:10:01

Mathieu
Membre
Inscription : 15-02-2012
Messages : 8

Re : Erreur 403: CSRF verification failed.

Bonjour et merci.

J'utilise Django version 1.3.1.

Je vais regarder comment utiliser FireBug pour vérifier la présence des tokens.

*** MISE A JOUR *** J'ai testé en désactivant la vérification du csrf sur les vues. Je n'ai plus l'erreur liée au CSRF, mais ça plante quand même:

NoReverseMatch at /polls/1/vote/

Reverse for 'mysite.polls.views.results' with arguments '(1,)' and keyword arguments '{}' not found.

Je pense qu'il est plus sage de laisser là le tuto français et de suivre le tuto anglais.

Merci encore à vous deux pour votre aide.

Dernière modification par Mathieu (18-02-2012 12:38:47)

Hors ligne

#6 18-02-2012 09:07:54

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

Re : Erreur 403: CSRF verification failed.

C'est une mailing list donc emails visibles
Le 18 févr. 2012 03:10, "Endash" <mathieu.lindemann _AT_ gmail.com> a écrit :

> Bonjour et merci.
>
> J'utilise Django version 1.3.1.
>
> Je vais regarder comment utiliser FireBug pour vérifier la présence des
> tokens.
>
> Par contre, comment se fait-il que mon adresse e-mail soit visible dans
> ton message ?? Les paramètres de vie privée du profil ne sont pas pris en
> compte ??
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

Pied de page des forums