2010-08-25 24 views
5

¿Los formularios que usan el método POST requieren tener protección CSRF? Estoy siguiendo un libro y los ejemplos de código arrojan 403 errores. Realicé algunas búsquedas y parece que necesito habilitar CSRF en todos mis formularios.Django: formulario POST requiere CSRF? GET no?

Mis preguntas son:

  1. ¿El Django ahora requiere que todas las formas de POST ser protegidos de CSRF?

  2. Todo lo que necesito hacer para lograr esto es añadir 'django.middleware.csrf.CsrfViewMiddleware', render_to_response retorno (plantilla, diccionario, context_instance = RequestContext (petición), y añadir '{% csrf_token%}' en el correspondiente formulario? me estoy perdiendo algo aquí?

Cuando hago esto, la forma funciona bien. Cuando alguna de estas piezas que faltan, no logra 403. Sólo quiero para asegurarse de que lo estoy haciendo DERECHA. :)

Gracias de antemano.

edición:

Por alguna razón, este código no tiene sentido para mí, pero es imposible devuelve ningún error. Por favor, ignore la validación primitiva ya que no he llegado a la sección del libro donde se muestra la forma más eficiente de hacerlo todavía.

def contact(request): 
    errors = [] 

    if request.method == 'POST': 
     if not request.POST.get('subject',''): 
      errors.append('Enter a subject') 
     if not request.POST.get('message',''): 
      errors.append('Enter a message') 
     if request.POST.get('email', '') and '@' not in request.POST['email']: 
      errors.append('Enter a valid email address') 
     if not errors: 
      send_mail(
       request.POST['subject'], 
       request.POST['message'], 
       request.POST.get('email', '[email protected]'), ['[email protected]'],) 
      return HttpResponseRedirect('/contact/thanks/') 

    return render_to_response('contact_form.html', { 'errors': errors }, context_instance=RequestContext(request)) 

Mi problema es con la última línea de esta función de vista. Solo se llama si request.method! = POST. Esto me parece completamente incorrecto. ¿No debería estar llamando "context_instance = RequestContext (request)" cuando está haciendo un POST?

Respuesta

7

POST se debe utilizar para obtener información confidencial, como contraseñas, y django requiere asegurarlo con csrf_token; GET debe usarse para marcar cosas que no necesitan ser aseguradas, como las búsquedas. Usted lo está haciendo bien.

EDITAR

No debería estar llamando context_instance=RequestContext(request) cuando se está haciendo un POST, usted debe estar llamándolo sin importar el tipo de solicitud. Mírelo así:

  • ¿Es un POST? esto significa que el formulario fue enviado. Validamos el formulario y redirigimos al usuario a otra página si el formulario está OK, o muestra el formulario nuevamente al usuario, con los errores.
  • ¿Es GET? esto significa que no se envió el formulario, pero están sucediendo otras cosas que no nos importan (algún enlace de referencia u otras cosas). Mostrar el formulario de todos modos

acciones en cursiva son realizadas por la última vuelta, independientemente del si.