使用塔式验证和Authenticate_form Decorator
-
24-10-2019 - |
题
验证和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 Decorator使用htmlfill.render重新渲染该表单,但这会删除身份验证令牌,因此在下次提交表单时显示了403 CSRF检测到的错误。
身份验证令牌似乎被剥离了,因为@Authenticate_form从request.post删除了身份验证令牌。
如果使用的是:
@validate(schema=MeowForm(), form='index', force_defaults=False)
它可以正常工作。如果将force_defaults设置为false,可能会发生任何坏事吗? HTMLFILL的文档似乎建议将默认值“是表单提交的结果”设置为true。
解决方案
@validate(schema=MeowForm(), form='index')
@authenticate_form
def do_post(self):
您需要更改装饰师的顺序,身份验证的装饰器必须是最后的
不隶属于 StackOverflow