пилоны: проверка данных на уровне модели - PullRequest
3 голосов
/ 04 ноября 2010

Я оцениваю некоторые фреймворки веб-приложений, и, наконец, два из крупнейших претендентов (на мой взгляд) - это Ruby on Rails и Pylons. Чтобы лучше понять две платформы, не тратя слишком много времени, я решил следовать нетривиальному руководству по приложениям для одной платформы и попытаться повторить то же самое для другой. Я надеюсь, что это упражнение высветит очевидные различия.

Для моего эксперимента я выбрал Ruby on Rails Tutorial . Я закончил приложение в Rails, и теперь я начал делать это в Pylons. Я дошел до главы 6 без особой драмы (учитывая, что до этого момента это в основном статические страницы, это неудивительно). Теперь мне нужно реализовать модель для пользователей и добавить логику проверки в модель. Первая часть проста, но я застрял на второй части.

Из того, что я вижу, Pylons применяет подход к проверке на уровне формы. Проводя некоторые исследования, я видел, что многие люди полагают, что точка, в которой вы принимаете ввод формы, является правильным местом для проверки ввода. Я также прошел через множество проектов пилонов на github, и мне не удалось найти ни одного проекта, который бы обрабатывал данные на уровне модели. Самое близкое, что я видел, было то, где разработчики хранили свои формы вместе с данными на уровне модели, но, на мой взгляд, это обман. Я не возражаю против того, чтобы следовать руководству к письму и следовать за толпой, но я согласен с этим руководством. Для рассматриваемой модели проверки выполняются в нужном месте: проверка длины пароля, длины имени пользователя и проверка того, что электронная почта на самом деле является электронной почтой, все считают ограничениями на уровне модели. Кроме того, если у меня будет хотя бы две формы, которые будут добавлять данные в эту модель (создание нового пользователя и изменение информации), и повторение одной и той же проверки в двух разных формах не будет правильным.

Короче говоря (выделено для TLDR): есть ли инфраструктура, которую я могу использовать, которая связывает формы с моделями более плотно, чем предлагаемая пара SQLAlchemy / formencode? С этими Во-вторых, лучшее, что я могу сделать, это добавить утверждения на уровне модели. На самом деле, это неправда, я мог бы попытаться преодолеть этот пробел с помощью пользовательского кода, но он выглядит как ужасно много кода, и его довольно сложно понять. Итак, я подумал, что было бы лучше спросить, прежде чем пытаться расширить код, который я не совсем понимаю.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2010

Итак, во-первых, я не знаю ни одного встроенного способа. Проверка на уровне формы имеет смысл, потому что разные формы / представления могут обращаться к одной и той же модели и должны выполнять разные проверки в зависимости от текущего пользователя, ситуации (основанной на времени) и т. Д. Так что я один из тех, кто выполняет проверку как часть уровня контроллера вещей.

Теперь, когда вы указали, что кода много, я думаю, вы можете легко создать схему formencode как часть ваших моделей SqlAlchemy (SA), а затем просто подключиться к событиям SA для объекта save () и запустить схема проверки там. Или напишите функцию-обертку, которую вы используете для заполнения исходного объекта перед выполнением сохранения. Так что вместо:

person = Session.Query(People).get(10)
person.fname = request.params['fname']
person.lname = request.params['lname']

Вы бы сделали что-то более похожее на:

person = Session.Query(People).get(10)
person.populate(request.params)

и он будет перебирать параметры и столбцы в объекте, чтобы установить его, выполняя валидацию по пути.

Извините, что вы не то, что ищете, но надеюсь, что это поможет вам найти достойную золотую середину.

1 голос
/ 04 ноября 2010

SQLAlchemy дает вам базовых декораторов проверки , когда вы используете метод class + mapper.Достаточно ли этой инфраструктуры для ваших нужд?

Кроме того, повторяя Рика, имейте в виду, что вашему приложению, возможно, не нужно постоянно соблюдать одни и те же правила проверки в отношении данной таблицы.

...