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。