2011-01-23 15 views
8

Django 1.2 mi dà costantemente questo errore di verifica CSRF quando eseguo un modulo POST. I "penso" Ho fatto tutte le cose chieste nelle Django 1.2 docs, vale a dire,Django 1.2.4 Verifica CSRF fallita

  1. Controlla che MIDDLEWARE_CLASSES è incluso con 'django.middleware.csrf.CsrfViewMiddleware'

  2. Assicurarsi che il {% % csrf_token}

    <form action="/words/new/" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
        <input type="submit" value="Enter" /> 
    </form> 
    
  3. Usa RequestContext nella mia risposta

    def create(request): 
        if request.method == 'POST': 
         form = DefinitionForm(request.POST) 
         if form.is_valid(): 
          form.save() 
         c = {} 
         return render_to_response('dict/thanks.html',c, 
                context_instance=RequestContext(request)) 
        else: 
         form = DefinitionForm() 
        return render_to_response('dict/create_definition.html', { 
         'form' : form, 
        }) 
    

Si noti che l'azione GET funziona in questa funzione. Quindi penso che io stia usando correttamente il rendering alla risposta.

Ho persino provato a inserire il decoratore @csrf_protect e anche quello non sembra funzionare. Sono fuori di idee e sto per soffocare me stesso con il mio portatile.

Qualunque cosa a cui voi ragazzi potete pensare?

Grazie!

+0

Controllare l'HTML nel browser per assicurarsi che il campo token csrf sia lì. Quindi scaricare le risposte POST per verificare che ritorni alla vista. – Spacedman

risposta

7

Non stai seguendo # 3. È necessario utilizzare RequestContext con il rendering del modello che mostra il modulo. Non è necessario per la pagina dei ringraziamenti.

return render_to_response('dict/create_definition.html', { 
    'form' : form, 
}, context_instance=RequestContext(request)) 

E come nota a margine, è necessario utilizzare il PRG pattern invece di rendere direttamente alla pagina dei ringraziamenti.

+0

Questo vale per l'azione GET. Se si guarda di nuovo il codice, l'ho incluso per la condizione quando request.method == 'POST'. – Bryan

+3

@bryli: esattamente questo è il problema. Il processore di contesto CSRF richiede il contesto della richiesta quando crea il token e lo inserisce nel contesto del modello, (probabilmente) non durante il controllo nel POST. – AndiDog

+0

Mi ha aiutato, grazie! – Chris

Problemi correlati