使用Pylons验证和authenticate_form装饰器

时间:2010-06-05 18:32:56

标签: python pylons formencode htmlfill

validate和authenticate_form装饰器似乎并不能很好地协同工作。这是我的模板:

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

这是控制器:

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'

如果验证失败,表单将由@validate装饰器使用htmlfill.render重新呈现,但这会删除身份验证令牌,因此下次提交表单时会显示403 CSRF检测到的错误。

验证令牌似乎被剥离,因为@authenticate_form从request.POST中删除了身份验证令牌。

如果改用:

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

它工作正常。如果force_defaults设置为False会有什么不好的事情吗?当默认值“是表单提交的结果”时,htmlfill的文档似乎建议将其设置为True。

1 个答案:

答案 0 :(得分:2)

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

您需要更改装饰器的顺序,验证装饰器必须是最后的

相关问题