Данные отсутствуют после использования @validate со схемой

Я работаю над проверкой своего веб-приложения, которое использует 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 становится равным нулю, и я не могу ничего делать в

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)

Спасибо за помощь


person A-Palgy    schedule 24.11.2014    source источник


Ответы (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 в вашем коде.

person amol    schedule 25.11.2014
comment
Спасибо, добавление возвращаемого значения сработало отлично. Я также обновил версию tg с 2.3.3 до 2.3.4, но мне не удалось заставить @decode_params декодировать входящие значения. - person A-Palgy; 27.11.2014