Django-fr

Forum

#1 06-07-2014 14:47:58

Lauwynn
Membre
Inscription : 06-07-2014
Messages : 3

CRSF token

Bonjour,

Voila depuis quelque temps je me suis mit à Python et plus particulièrement au framework Django, tout ce déroule plus ou moins bien jusqu'à ce que je tombe lors d'un test de formulaire, qu'il y a ces fameux crsf token, et la problématique c'est que je n'arrive pas à les faire fonctionner, je me suis pourtant penché sur la doc du site officielle de django, et j'ai essayé de reproduire en essayant d'adapté ces derniers, mais à chaque fois c'est la même rengaine comme quoi je n'ai pas activé les crsf token.

Je viens donc vous voir dans l'espoir de trouver de l'aide smile.

forms.py:

from django import forms

class LoginForm(forms.Form):
    Pseudo = forms.CharField(label='Pseudonyme')
    mdp = forms.CharField(label='Mot de passe', widget=forms.PasswordInput)
    email = forms.EmailField(label='Mail')


login.html:

{% extends "base.html" %}

{% block contenu %}
<form action="login" method="post">{% csrf_token %}
    {{ form.as_p }}
    <p>
        <input type="submit" value="Envoyer"/>
        <a href="????">Créer un compte</a>
    </p>
</form>
{% endblock %}

et enfin mon views.py:

from django.shortcuts import render_to_response
from val.forms import LoginForm
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf

def accueil(request):
    return render_to_response('accueil.html')

def login(request):
    form = LoginForm()
    return render_to_response('login.html',{'form':form})

def valid_form(request):
    c = {}
    c.update(csrf(request))
    if request.method == 'POST':
        form1 = LoginForm(request.POST)
        if form1.is_valid():
            return HttpResponseRedirect('/accueil/')
    else:
        form1 = LoginForm()
    return render_to_response('login.html', {'form1', form1})

Je vous remercie d'avance.

PS: J'ai bien ajouté la ligne dans les MIDDLEWARE.

Hors ligne

#2 07-07-2014 08:58:36

Jaals
Membre
Inscription : 19-07-2013
Messages : 14

Re : CRSF token

Salut,

Le problème vient de la vue valid_form qui ne retourne qu'un formulaire dans le context. Il faut que le context contienne également le token comme indiqué ici : Cross Site Request Forgery protection.

++

Dernière modification par Jaals (07-07-2014 08:58:47)

Hors ligne

#3 07-07-2014 10:52:54

Lauwynn
Membre
Inscription : 06-07-2014
Messages : 3

Re : CRSF token

Merci, mais je suis pas sur de bien tout saisir, en somme je comprends pas trop ce qu'est le "context" je l'ai bien vu sur le site, mais je ne suis pas sur d'avoir compris ce que c'est, je débute vraiment là dedans donc j'ai encore beaucoup de lacunes ^^'.
Merci encore ^^.

Hors ligne

#4 07-07-2014 11:28:26

Jaals
Membre
Inscription : 19-07-2013
Messages : 14

Re : CRSF token

Le context est un dictionnaire qui permet de passer des données au template.

Dans la vue, il est créé ainsi :

c = {}
c.update(csrf(request))

Auquel tu as besoin d'ajouter le formulaire :

c['form1'] = form1

Au final, la vue valid_form devrait ressembler à ça :

def valid_form(request):
    c = {}
    c.update(csrf(request))
    if request.method == 'POST':
        form1 = LoginForm(request.POST)
        if form1.is_valid():
            return HttpResponseRedirect('/accueil/')
    else:
        form1 = LoginForm()
    c['form1'] = form1
    return render_to_response('login.html', c)

Hors ligne

#5 07-07-2014 11:42:18

Lauwynn
Membre
Inscription : 06-07-2014
Messages : 3

Re : CRSF token

D'accoooord merci de l'explication c'est beaucoup plus clair comme ça smile

Je viens d'essayer et il me met toujours l'erreur 403 sad

Hors ligne

#6 13-07-2014 18:12:35

vache67
Membre
Inscription : 27-11-2012
Messages : 12

Re : CRSF token

essaye  return render_to_response('login.html', locals())

Hors ligne

#7 15-07-2014 10:46:19

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 312
Site Web

Re : CRSF token

Deux choses:
1) n'utilisez plus render_to_response. Utilisez render à la place (https://docs.djangoproject.com/en/1.6/t … ts/#render).
Cela évitera les cas dans lesquels le RequestContext est oublié (ce qui implique que le token csrf n'est pas passé au template entre autre choses).

2) NE JAMAIS PASSER locals() au context. C'est une mauvaise pratique parce que l'intégralité du contexte de la fonction est passé au template et on préfère l'éviter.

Hors ligne

Pied de page des forums