Frage

Die Dekorateure Validate und Authenticate_form scheinen nicht zusammen gut zu spielen. Dies ist meine Vorlage:

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

Und das ist der 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'

Wenn die Validierung fehlschlägt, wird das Formular durch den @Validat Decorator mit htmlfill.render neu geführt. Dies streift jedoch das Authentifizierungs-Token aus, sodass ein 403-CSRF-Fehler beim nächsten Senden des Formulars angezeigt wird.

Das Authentifizierungs -Token scheint entzogen zu werden, da @Authenticate_form das Authentifizierungs -Token von Request.post löscht.

Wenn dies stattdessen verwendet wird:

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

es funktioniert gut. Gibt es etwas Schlimmes, das passieren kann, wenn Force_Defaults auf false eingestellt ist? Die Dokumente für HTMLFill scheinen zu empfehlen, sie auf True einzusetzen, wenn die Standardeinstellungen "das Ergebnis einer Formulareingabe sind".

War es hilfreich?

Lösung

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

Sie müssen die Reihenfolge der Dekorateure ändern, der Authentifizierer muss zuletzt sein

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top