質問

検証およびAuthentivate_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のドキュメントは、デフォルトが「フォームの提出の結果」である場合、それを真に設定することを推奨するようです。

役に立ちましたか?

解決

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

デコレーターの順序を変更する必要があります、認証デコレータは最後でなければなりません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top