2010-06-05 51 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): 

您需要更改裝飾的秩序,驗證裝飾必須是最後