2011-01-23 13 views
8

Django 1.2 me está dando sistemáticamente este error de verificación CSRF cuando realizo una forma POST. I "que" he hecho todas las cosas hechas en la documentación de Django 1.2, a saber,Verificación Django 1.2.4 CSRF fallida

  1. Asegurar MIDDLEWARE_CLASSES se incluye con 'django.middleware.csrf.CsrfViewMiddleware'

  2. Asegúrese de que el {% % csrf_token}

    <form action="/words/new/" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
        <input type="submit" value="Enter" /> 
    </form> 
    
  3. uso RequestContext en mi respuesta

    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, 
        }) 
    

Tenga en cuenta que la acción GET funciona en esta función. Entonces creo que estoy usando render_to_response correcto.

Incluso he tratado de incluir el decorador @csrf_protect e incluso eso no parece funcionar. Me he quedado sin ideas y estoy a punto de ahogarme con mi computadora portátil.

¿Alguna cosa que ustedes puedan pensar?

Gracias!

+0

Compruebe el código HTML en su navegador para asegurarse de que el campo de token csrf está allí. A continuación, vuelque las respuestas POST para comprobar que vuelve a la vista. – Spacedman

Respuesta

7

No estás siguiendo # 3. El RequestContext se debe utilizar con la representación de la plantilla que muestra el formulario. No es necesario para la página de agradecimiento.

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

Y como nota al margen, se debe utilizar el PRG pattern en lugar de hacer que la página de agradecimiento directamente.

+0

Eso es para la acción GET. Si vuelves a mirar el código, lo he incluido para la condición cuando request.method == 'POST'. – Bryan

+3

@bryli: Exactamente ese es el problema. El procesador de contexto CSRF necesita el contexto de la solicitud al crear el token y colocarlo en el contexto de la plantilla, (probablemente) no al verificarlo en el POST. – AndiDog

+0

Me ayudó, gracias! – Chris

Cuestiones relacionadas