validate 및 authenticate_form 데코레이터는 서로 잘 어울리지 않는 것 같습니다. 이것은 내 템플릿입니다 :Pylons 사용 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로 설정하는 것이 좋습니다.