Question

Le validate et décorateurs authenticate_form ne semblent pas jouer bien ensemble. Ceci est mon modèle:

<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>

Et voici le contrôleur:

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 validation échoue, la forme est de nouveau rendu à l'aide htmlfill.render par le décorateur @validate, mais cette bande à l'authentification jeton, donc un 403 CSRF erreur détectée est affichée la prochaine fois que le formulaire est soumis.

Le jeton d'authentification semble être dépouillée car @authenticate_form supprime l'authentification par jeton de request.POST.

Si cela est utilisé à la place:

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

il fonctionne très bien. Est-il mauvais tout ce qui peut se produire si force_defaults est définie sur False? Les documents pour htmlfill semblent recommanderait de la valeur True lorsque les valeurs par défaut « sont le résultat d'une soumission de formulaire ».

Était-ce utile?

La solution

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

Vous devez changer l'ordre des décorateurs, décorateur Authentifier doit être le dernier

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top