使用@validate with Schem后缺少数据

2024-09-29 23:19:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在验证我的webapp,它使用turbogears2.3.3和formencode1.3

我想验证用户通过表单创建过程创建的动态表单。 我使用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)

谢谢你的帮助


Tags: oftoselfjsonconvertdatavaluedef
1条回答
网友
1楼 · 发布于 2024-09-29 23:19:22

可能orderItemSchema._convert_to_python缺少返回值。应该是return super(orderItemSchema,self)._convert_to_python(value_dict, state),否则将返回None作为转换值

如果您使用的是最新的tg版本,我建议您还可以看看@decode_paramsdecorator(http://turbogears.readthedocs.org/en/latest/reference/classes.html#tg.decorators.decode_params),它将从json主体中提取控制器参数,并让验证像往常一样流动。它将避免代码中的两个json.load

相关问题 更多 >

    热门问题