【问题标题】:Data is missing after using @validate with Schema将 @validate 与 Schema 一起使用后数据丢失
【发布时间】:2015-01-22 04:34:14
【问题描述】:

我正在验证我的 webapp,它使用的是 Turbogears 2.3.3 和 formencode 1.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)

感谢您的帮助

【问题讨论】:

    标签: python validation schema turbogears2 formencode


    【解决方案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 主体中提取控制器参数并让验证照常进行。它将避免代码中的两个json.load

    【讨论】:

    • 谢谢,添加返回值效果很好。我还将 tg 版本从 2.3.3 更新到 2.3.4,但我无法让 @decode_params 解码传入的值
    猜你喜欢
    • 2022-01-26
    • 2019-10-24
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2022-10-17
    • 2012-10-21
    相关资源
    最近更新 更多