0

Turbogears 2.3.3 と formencode 1.3 を使用している webapp の検証に取り組んでいます。

ユーザーがフォーム作成プロセスを通じて作成した動的フォームを検証したいと考えています。json を使用してクライアントからサーバーにフォーム フィールドを送信して、物事を整理しています。
データの送信方法は次のとおりです。

var dataToSend = JSON.stringify({
        'num_of_copies': num_of_copies.val(),
        'amountAnswers' : amountAnswers,
        'yesNoAnswers' : yesNoAnswers,
        'selectAnswers' : selectAnswers,
        'comments':comments.val()
    })

    $.ajax({
        type: 'POST',
        url: siteProxy+'orders/saveOrderItem',
        data: {'data':dataToSend},
        dataType: "json",
        success: function (data, textStatus) {
            if (textStatus == "success") {
                if (data.errors){
                    console.log(data.errors)
                }
            }
        },
        error: function (data, textStatus) {
            alert('error');
        }
    })

サーバー上でデータを検証してから、いくつかのことをしたい

@expose('json')
@validate(validators=orderItemSchema(),error_handler=simpleErrorHandler)
def saveOrderItem(self,**kw):
    answers = json.loads(kw['data'])
    ...... do stuff ...

検証がなければ、私のコードは機能します。

ここに私の検証スキーマがあります:

class orderItemSchema(Schema):
    def _convert_to_python(self, value_dict, state):
        value_dict = json.loads(value_dict['data'])
        super(orderItemSchema,self)._convert_to_python(value_dict, state)

    num_of_copies = validators.Number(min=1)
    comments = validators.UnicodeString()
    amountAnswers = ForEach(AmountAnswerValidator())
    yesNoAnswers = ForEach(YesNoAnswerValidator())
    selectAnswers = ForEach(SelectAnswerValidator())

検証はうまく機能します。


私の問題はこれです:検証の後、kw は none になり、私は何かをすることができません

def saveOrderItem(self,**kw):

問題はコードの次の部分のどこかにあると思います。

class orderItemSchema(Schema):
    def _convert_to_python(self, value_dict, state):
        value_dict = json.loads(value_dict['data'])
        super(orderItemSchema,self)._convert_to_python(value_dict, state)

助けてくれてありがとう

4

1 に答える 1

1

おそらくorderItemSchema._convert_to_python戻り値がありません。そうでなければ、変換された値としてreturn super(orderItemSchema,self)._convert_to_python(value_dict, state)返さNoneれます。

最近の tg バージョンを使用している場合は、@decode_paramsデコレータ ( http://turbogears.readthedocs.org/en/latest/reference/classes.html#tg.decorators.decode_params ) も参照することをお勧めします。コントローラが抽出されます。パラメータを json 本体から取得し、検証の流れを通常どおりにします。コード内の2つを回避json.loadします。

于 2014-11-25T08:21:57.133 に答える