2011-11-11 2 views
15

Principiante in Django qui, ho cercato di sistemarlo da molto tempo. Ho 'django.middleware.csrf.CsrfViewMiddleware' nelle mie classi middleware e ho il token nel mio modulo di post.Token CSRF mancante o errato

Ecco il mio codice, cosa sto sbagliando?

from django.contrib.auth.forms import UserCreationForm 
from django.shortcuts import render_to_response 
from django.http import HttpResponseRedirect 
from chartsey.authentication.forms import RegistrationForm 
from django.template import RequestContext 
from django.core.context_processors import csrf 

def register(request): 

    if request.method == 'POST': 
     c = RequestContext(request.POST, {}) 
     form = RegistrationForm(c) 
     if form.is_valid(): 
      new_user = form.save() 
      return HttpResponseRedirect("/") 
    else: 
     form = RegistrationForm() 

    return render_to_response("register.html", {'form': form, },) 

Ecco il mio modello:

{% block content %} 

    <h1>Register</h1> 
    <form action="" method="POST"> {% csrf_token %} 
     {{ form.as_p }} 
    <input type="submit" value="Submit"> 
    </form> 

{% endblock %} 
+0

possibile duplicato di [Django: CSRF Token mancante o errato] (http://stackoverflow.com/questions/8321217/ django-csrf-token-missing-or-incorrect) – lracicot

risposta

21

La mia ipotesi è che si ha il tag nel modello ma non è il rendering nulla (o volevi dire avete confermato nel codice HTML effettivo che un token CSRF è viene generato?)

usare sia RequestContext invece di un dizionario

render_to_response("foo.html", RequestContext(request, {})) 

Oppure assicurati di avere django.core.context_processors.csrf nell'impostazione CONTEXT_PROCESSORS.

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

Or add the token to your context manually

+0

Questo ha fatto! Ho ancora un po 'di problemi a capirlo completamente, ma almeno sono passato a fissare in bianco e cercando di cambiare le cose a caso. I documenti non mi hanno aiutato troppo, grazie mille! – arooo

+0

Questo è il punto 3 della documentazione :) I documenti di Django sono fantastici se ti lasci scavare un po '. In bocca al lupo! –

+0

Grazie mille, questo ha risolto il mio problema. Consiglio generale per tutti: controlla se l'utente render_to_response() con i parametri corretti, ho incasinato e gli ho dato 3 parametri, quindi è risultato nell'errore sopra riportato. – Phonebox

5

Basta aggiungere questo ai vostri punti di vista

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

Funzionerà !!

0

Se non si utilizza CsrfViewMiddleware, è necessario utilizzare csrf_protect su qualsiasi vista che utilizza il tag del modello csrf_token, nonché su quelli che accettano i dati POST.

0

L'aggiunta di RequestContext è la chiave quando si utilizza render_to_response come menzionato da @Yuji "Tomita" Tomita e @Njogu Mbau. Tuttavia, ciò che inizialmente mi ha buttato fuori quando ero alle prese con questo problema era che dovevo aggiungere RequestContext a entrambe le funzioni in views.py che inizialmente carica il modello e alla funzione in views.py che gestisce l'invio dal modello.

Inoltre, solo per riferimento, qui ci sono alcuni altri link che trattano questo stesso problema

0

Inoltre, ha ottenuto questo errore in modo casuale in alcune pagine dopo l'installazione di django-livereload-server. La disinstallazione di django-livereload-server ha funzionato.

-1

Quello che ha funzionato per me stava commentando la riga al di sotto del mio settings.py

'django.middleware.csrf.CsrfViewMiddleware'