Данные отсутствуют после использования @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)
Спасибо за помощь
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), он извлекает параметры контроллера из тела json и позволяет проверке проходить в обычном режиме. Это позволит избежать двух json.load
в вашем коде.