2010-06-05 94 views
2

验证和authenticate_form装饰器似乎不能很好地在一起玩。这是我的模板:使用Pylons验证和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> 

这是控制器:使用htmlfill.render由@Validate装饰

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' 

如果验证失败,形式重新呈现,但这种剥离出来的身份验证令牌,因此下次提交表单时会显示403 CSRF检测到的错误。

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

如果这个来代替:

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

它工作正常。如果force_defaults设置为False,是否会发生任何不良情况?当默认值“是表单提交的结果”时,htmlfill的文档似乎建议将其设置为True。

回答

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

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