1

Как проверить модель GAE без sql «ndb» в python?Проверка правильности NDB Google

Есть шаблон для этого. Допустим, у меня есть модель под названием Иерархическая

class BreadCrumb_Ndb(ndb.Model): 
    """ A model for building breadcrumbs on the site """ 
    item_prop = ndb.StringProperty() 
    item_type = ndb.StringProperty() 
    href = ndb.StringProperty() 

Я хочу, чтобы проверить свойство HREF, чтобы обеспечить его формат URL-адресов с использованием регулярных выражений.

+0

Откуда берутся данные? Форма? –

+0

В конце концов да, это будет из формы. –

ответ

1

WTForms может быть именно то, что вам нужно, как это будет даже создавать форму для вас, то проверить его на представлении:

С WTForms, ваше поле формы HTML может быть создан для вас, но мы пусть вы настраиваете его в своих шаблонах. Это позволяет поддерживать разделение кода и презентации и сохранять эти беспорядочные параметры из вашего кода на Python. Поскольку мы стремимся к свободному соединению, вы должны иметь возможность делать это в любом шаблоном двигателя, который вам нравится. Как ваши данные поступают из формы вы можете использовать собственный валидатор в WTForms Здесь вам нужно, чтобы добавить свой собственный валидатор для hrefs:

class MyForm(Form): 
    name = StringField('Name', [InputRequired()]) 

    def validate_name(form, field): 
     if len(field.data) > 50: 
      raise ValidationError('Name must be less than 50 characters') 

NDB теперь поддерживается: https://wtforms.readthedocs.org/en/1.0.4/ext.html

В этом ответе приводится альтернативная альтернатива: Evaluate a condition after put() in NDB and GAE

, где вы можете использовать проверенный положительный крюк.

+0

и вот пример с WTForms и регулярным выражением. Http://stackoverflow.com/q/25533370/8418 – Lipis

2

В соответствии с documentation, типы ndb принимают аргумент validator, который используется для проверки/принуждения ввода свойства. Однако, как правило, разумнее проверять представленную форму (так как это похоже на то, что вы намереваетесь сделать), прежде чем пытаться вставить ее в БД (WTForms отлично подходит для этого варианта использования).

+0

Как выполнить проверку на пересечении полей? например: Model имеет start_date и end_date, и я хочу, чтобы start_date был меньше, чем end_date. –

+0

@akshar Я не использовал движок какое-то время, но, основываясь на своем ответе, я считаю, что 'validator' не предназначен для перекрестной проверки, а просто проверяет тип и формат и принуждение, если это необходимо. Другими словами, вам придется обрабатывать это до вставки db. – sirfz

1

Как уже упоминалось в другом ответе, подкласс свойств ndb принимает аргумент validator.

Дополнительная функция для проверки и, возможно, принудительного использования значения.

Будет вызываться с аргументами (prop, value) и должен либо вернуть (возможно, принудительное) значение, либо вызвать исключение. Вызов функции снова по принудительному значению не должен далее изменять значение. (Например, return value.strip() или value.lower() в порядке, но не значение + '$'.) Может также вернуть None, что означает «без изменений».

исх: https://cloud.google.com/appengine/docs/python/ndb/properties#options

Лучше применить проверку как можно ближе к данным, как это возможно. Это предотвратит возможность нестандартных задач ввода данных в коррумпировать ваши поля. Нечто похожее на это должно работать:

from urlparse import urlsplit 
def is_url(prop, value): 
    o = urlsplit(value) 
    if not o.scheme or not o.netloc: 
     raise Exception("{} is not a valid URL".format(value)) 
    return value 

class BreadCrumb_Ndb(ndb.Model): 
    """A model for building breadcrumbs on the site""" 
    item_prop = ndb.StringProperty() 
    item_type = ndb.StringProperty() 
    href = ndb.StringProperty(validator=is_url) 
+0

Как выполнить проверку на пересечении полей? например: Model имеет start_date и end_date, и я хочу, чтобы start_date был меньше, чем end_date. –

0

Если проверка поперечного поля необходимо, то, возможно, перекрывая ставить() это самый быстрый способ.

def put(self, *args, **kwargs): 
    if self.start_date > self.end_date: 
     raise Exception("start_date must be less than end_date") 
    return super(BaseModel, self).put(*args, **kwargs) 
Смежные вопросы