Domanda

Il convalidare e authenticate_form decoratori non sembrano giocare piacevole insieme. Questo è il mio modello:

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

E questo è il controller:

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'

Se la convalida fallisce, la forma è re-rendering utilizzando htmlfill.render dal decoratore @validate, ma questo estrae il token di autenticazione, quindi un 403 CSRF rilevato un errore è visualizzato alla successiva presentazione della forma.

Il token di autenticazione sembra essere spogliato perché @authenticate_form cancella il token di autenticazione da request.POST.

Se questo è usato invece:

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

funziona benissimo. C'è qualcosa male che può accadere se force_defaults è impostato su False? La documentazione per htmlfill sembrano consigliarlo essere impostato su True quando i valori di default "sono il risultato di un invio di un modulo".

È stato utile?

Soluzione

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

È necessario ordine di modifica di decoratori, autenticazione decoratore deve essere l'ultimo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top