Pregunta

Los decoradores Validate y Authenticate_Form no parecen jugar bien juntos. Esta es mi plantilla:

<html>
<title>Test</title>
<body>
${h.secure_form('/meow/do_post')}
<input type="text" name="dummy">
<form:error name="dummy"><br>
<input type="submit" name="doit" value="Do It">
${h.end_form()}
</body>
</html>

Y este es el controlador:

import logging

from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from ocust.lib.base import BaseController, render
import formencode
import formencode.validators
from formencode import htmlfill
from pylons.decorators import validate
from pylons.decorators.secure import authenticate_form

class MeowForm(formencode.Schema):
    allow_extra_fields = True
    dummy = formencode.validators.NotEmpty()

class MeowController(BaseController):

    def index(self): 
        return render('/index.mako')

    @authenticate_form
    @validate(schema=MeowForm(), form='index')
    def do_post(self):
        return 'posted OK'

Si la validación falla, el formulario se vuelve a renderizar utilizando htmlfill.render por el decorador @Validate, pero esto elimina el token de autenticación, por lo que se muestra un error detectado de 403 CSRF la próxima vez que se envíe el formulario.

El token de autenticación parece estar despojado porque @authenticate_form elimina el token de autenticación de request.post.

Si esto se usa en su lugar:

@validate(schema=MeowForm(), form='index', force_defaults=False)

funciona bien. ¿Hay algo malo que pueda suceder si force_defaults está configurado en falso? Los documentos para HTMLFill parecen recomendarlo se establece en True cuando los valores predeterminados "son el resultado de una presentación de formulario".

¿Fue útil?

Solución

@validate(schema=MeowForm(), form='index')
@authenticate_form
def do_post(self):

Debe cambiar el orden de los decoradores, el decorador de autenticación debe ser el último

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top