2014-01-07 2 views
2

Я только начал использовать Pyramid для одного из моих проектов, и у меня есть случай, когда мне нужно проверить ввод поля формы, взяв это значение поля формы и сделав вызов веб-службы, чтобы утверждать правильность значения. Например, есть поле под названием КЛИЕНТ-ID вашего банка. Мне нужно взять это (отдельно) в качестве ввода и проверить на уровне сервера, сделав вызов веб-службы (например, http://someotherdomain/validate_customer_id/?customer_id=<input_value>).Какой правильный подход для проверки формы? Проверка схемы Colander или подтверждение формы Deform?

Я использую Colander для управления схемой формы и Deform для всей логики проверки формы. Я смущен тем, где мне нужно разместить мою логику проверки для случая КЛИЕНТА-ИД. Является ли оно MySchema().bind(customer_id=<input_value>) (у которого есть отложенный валидатор, который запрашивает веб-сервис) или что-то в form.validate (request.POST.items())? Если я возьму путь отложенного валидатора, то MySchema().bind поднимет ошибку colander.Invalid за неправильный идентификатор пользователя CUSTOMER. Хорошо. Но эта ошибка не на уровне формы, а на уровне схемы. Итак, как я могу сказать пользователю об этом разумным способом?

У меня есть хороший опыт работы с формами Django, поэтому я ожидал чего-то вроде clean метода. Ошибка формы, например form ['customer_id']. Ошибка - это то, что я ожидаю на уровне шаблона. Возможно ли это с деформированием пирамиды или с дуршлагом?

ответ

8

Итак, я думаю, что большая проблема, с которой вы сталкиваетесь, заключается в понимании разделения проблем с Колландером и Дефортом. Colander - это то, что люди любят вызывать общую библиотеку проверки схемы. Это означает, что мы определяем схему, где каждый узел имеет конкретный тип данных, и некоторые узлы могут потребоваться/необязательно. Затем Colander может проверить эту схему и сообщить нам, соответствуют или нет данные, которые мы передали дуршлагу, соответствуют этой схеме. Например, в моих веб-приложениях я часто создаю apis, которые принимают параметры GET/POST, которые необходимо проверить. Таким образом, в пирамиде, скажем, у меня есть такой сценарий:

request.POST = { 
    'post_id': 1, 
    'author_id': 1, 
    'unnecessary_attr': 'stuff' 
} 

Затем я могу проверить его следующим образом:

# schema 
schema = SchemaNode(Mapping(), 
        SchemaNode(Integer(), name='post_id'), 
        SchemaNode(Integer(), name='author_id')) 
schema.deserialize(request.POST) 

И это будет ошибка, если она не может соответствовать данные по указанной схеме. Таким образом, вы можете видеть, дуршлаг действительно может использоваться для проверки любого набора данных, независимо от того, поступают ли они из данных POST/GET/JSON. Деформация, с другой стороны, является библиотекой форм и помогает создавать/проверять формы. Он использует дуршлаг для всех потребностей проверки и as you can see, он в значительной степени просто делегирует проверку на дуршлаг. Поэтому, чтобы ответить на ваш вопрос, вы сделаете все свои проверки в дуршлаге, и деформирование будет в основном обрабатывать рендеринг ваших форм.

+2

Спасибо. Теперь его ясность понятна. Но если проверка схемы не удалась, как я могу сообщить об этом как ошибку формы? Как сообщать пользователю «Введен неверный CUSTOMER_ID»? Потому что они находятся на двух разных уровнях. –

+0

Это очень хороший ответ. +1 –

+0

@ None-da в экосистеме дуршлаг, сообщение, которое вы хотите изменить, определяется на уровне валидатора, то есть https://github.com/Pylons/colander/blob/master/colander/__init__.py#L314. Некоторые из них принимают «сообщение» kwarg, когда вы их создаете, а некоторые нет. – JayD3e

2

Чтобы увидеть пример применения яркой пирамиды и деформировать ее в действии, см. todopyramid в составе IndyPy Python Web Shootout. Приложение todo было реализовано в пирамиде, джанго, колбе и бутылке. Я изучил пример пирамиды - он хорошо написан, демонстрирует валидацию схемы деформации и использует бутстрап для отображения сообщений проверки.

Дополнительная информация о пирамидах here:

Смежные вопросы