110 votes

Django CSRF Cookie Not Set

J'ai un problème depuis un certain temps maintenant, j'ai un CSRF Cookie not set. Veuillez regarder les codes ci-dessous

Python

def deposit(request, account_num):
    if request.method == 'POST':
        account = get_object_or_404(account_info, acct_number=account_num)
        form_ = AccountForm(request.POST or None, instance=account)
        form = BalanceForm(request.POST)
        info = str(account_info.objects.filter(acct_number=account_num))
        inf = info.split()

        if form.is_valid():

            # cd=form.cleaned_data
            now = datetime.datetime.now()
            cmodel = form.save()
            cmodel.acct_number = account_num

            # RepresentsInt(cmodel.acct_number)
            cmodel.bal_change = "%0.2f" % float(cmodel.bal_change)
            cmodel.total_balance = "%0.2f" % (float(inf[1]) + float(cmodel.bal_change))
            account.balance = "%0.2f" % float(cmodel.total_balance)
            cmodel.total_balance = "%0.2f" % float(cmodel.total_balance)

            # cmodel.bal_change=cmodel.bal_change
            cmodel.issued = now.strftime("%m/%d/%y %I:%M:%S %p")
            account.recent_change = cmodel.issued
            cmodel.save()
            account.save()

            return HttpResponseRedirect("/history/" + account_num + "/")

        else:
            return render_to_response('history.html',
                                      {'account_form': form},
                                      context_instance=RequestContext(request))

Dans le HTML, voici le code

HTML

<form action="/deposit/{{ account_num }}/" method="post">
    <table>
        <tr>
            {{ account_form.bal_change }}
            &nbsp;
            <input type="submit" value="Deposit"/>
        </tr>
        {% csrf_token %}
    </table>
</form>

Je suis coincé, j'ai déjà effacé le cookie, utilisé un autre navigateur mais le cookie csrf n'est toujours pas installé.

6voto

Pratik Mhatre Points 391

J'ai rencontré une situation similaire en travaillant avec DRF, la solution était d'ajouter la méthode .as_view() à la vue dans urls.py.

2voto

drabo2005 Points 1040

Essayez de vérifier si vous avez installé dans le settings.py

 MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',)

Dans le modèle, les données sont formatées avec le csrf_token :

<form>{% csrf_token %}
</form>

1voto

sbaechler Points 485

Ce problème s'est à nouveau présenté récemment en raison d'un bogue dans Python lui-même.

http://bugs.python.org/issue22931

https://code.djangoproject.com/ticket/24280

Les versions 2.7.8 et 2.7.9 sont parmi les plus touchées. Le cookie n'était pas lu correctement si l'une de ses valeurs contenait un code [ caractère.

La mise à jour de Python (2.7.10) corrige le problème.

1voto

Gokul Yesudoss Points 11

Cela se produit également lorsque vous ne définissez pas l'action du formulaire.
Pour moi, il montrait cette erreur lorsque le code était :

<form class="navbar-form form-inline my-2 my-lg-0" role="search" method="post">

Quand j'ai corrigé mon code en ceci :

<form class="navbar-form form-inline my-2 my-lg-0" action="{% url 'someurl' %}" role="search" method="post">

mon erreur a disparu.

0voto

Rohan Points 22386

Le problème semble être que vous ne gérez pas GET de manière appropriée ou d'afficher directement les données sans avoir obtenu le formulaire au préalable.

Lorsque vous accédez à la page pour la première fois, le client envoie GET dans ce cas, vous devez envoyer le html avec le formulaire approprié.

Plus tard, l'utilisateur remplit le formulaire et envoie POST avec les données du formulaire.

Votre point de vue devrait être :

def deposit(request,account_num):
   if request.method == 'POST':
      form_=AccountForm(request.POST or None, instance=account)
      if form.is_valid(): 
          #handle form data
          return HttpResponseRedirect("/history/" + account_num + "/")
      else:
         #handle when form not valid
    else:
       #handle when request is GET (or not POST)
       form_=AccountForm(instance=account)

    return render_to_response('history.html',
                          {'account_form': form},
                          context_instance=RequestContext(request))

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