2010-06-05 4 views
2

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로 설정하는 것이 좋습니다.

답변

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

당신은 장식이 마지막으로해야합니다, 장식의 순서를 변경 인증 할 필요가