Python Google NDB模型验证
如何在python中验证GAE的无sql“ndb”模型 这有什么模式吗。假设我有一个叫做面包屑的模型Python Google NDB模型验证,python,google-app-engine,google-cloud-datastore,app-engine-ndb,Python,Google App Engine,Google Cloud Datastore,App Engine Ndb,如何在python中验证GAE的无sql“ndb”模型 这有什么模式吗。假设我有一个叫做面包屑的模型 class BreadCrumb_Ndb(ndb.Model): """ A model for building breadcrumbs on the site """ item_prop = ndb.StringProperty() item_type = ndb.StringProperty() href = ndb.StringProperty() 我想
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格式使用正则表达式 WTForms可能正是您所需要的,因为它甚至会为您生成表单,然后在提交时进行检查: 使用WTForms,可以为您生成表单字段HTML,但我们 允许您在模板中自定义它。这允许您维护 将代码和表示分离,并保留那些混乱的参数 从python代码中删除。因为我们努力实现松耦合,所以您 应该能够做到这一点,在任何模板引擎你喜欢,以及。 由于您的数据来自表单,因此可以在中使用自定义验证器 WTForms 在这里,您需要为hrefs添加自定义验证器: 现在支持NDB: 本答案中详细说明了一种替代方案:
在这里,您将运行post put钩子进行验证 WTForms可能正是您所需要的,因为它甚至会为您生成表单,然后在提交时进行检查: 使用WTForms,可以为您生成表单字段HTML,但我们 允许您在模板中自定义它。这允许您维护 将代码和表示分离,并保留那些混乱的参数 从python代码中删除。因为我们努力实现松耦合,所以您 应该能够做到这一点,在任何模板引擎你喜欢,以及。 由于您的数据来自表单,因此可以在中使用自定义验证器 WTForms 在这里,您需要为hrefs添加自定义验证器: 现在支持NDB: 本答案中详细说明了一种替代方案:
在这里,您将运行post put钩子进行验证 根据,ndb类型采用一个
验证程序
参数,用于验证/强制属性的输入。然而,在尝试将提交的表单插入DB之前,通常更明智的做法是验证提交的表单(因为这似乎是您打算做的事情)(WTForms非常适合此用例)。根据,ndb类型采用一个验证程序
参数,用于验证/强制属性的输入。但是,在尝试将提交的表单插入DB之前,验证表单通常更明智(因为这似乎是您想要做的事情)(WTForms非常适合此用例)。如另一个答案中所述,ndb属性子类接受验证器
参数
用于验证并可能强制该值的可选函数
将使用参数(prop、value)调用,并且应返回
(可能是强制的)值或引发异常。呼叫
再次对强制值执行函数时,不应进一步修改该值。
(例如,返回value.strip()或value.lower()是可以的,但是
not value+'$')也可能返回None,这意味着“无更改”
参考:
最好将验证应用到尽可能接近数据的地方。这将防止非表单数据输入任务损坏字段。类似的方法应该可以奏效:
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)
正如在另一个答案中提到的,ndb属性子类接受一个
验证器
参数
用于验证并可能强制该值的可选函数
将使用参数(prop、value)调用,并且应返回
(可能是强制的)值或引发异常。呼叫
再次对强制值执行函数时,不应进一步修改该值。
(例如,返回value.strip()或value.lower()是可以的,但是
not value+'$')也可能返回None,这意味着“无更改”
参考:
最好将验证应用到尽可能接近数据的地方。这将防止非表单数据输入任务损坏字段。类似的方法应该可以奏效:
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)
如果需要跨字段验证,那么重写put()可能是最快的方法
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)
如果需要跨字段验证,那么重写put()可能是最快的方法
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)
数据来自哪里?表单?最终是的,它将来自表单。数据来自哪里?表单?最终是的,它将来自表单。下面是一个WTForms和正则表达式的示例。。下面是一个WTForms和正则表达式的示例。。如何进行跨领域验证?例如:模型有开始日期和结束日期,我想确保开始日期应该小于结束日期。@akshar我已经有一段时间没有使用引擎了,但根据我的回答,我相信
验证器
不是用于交叉验证,而只是在必要时进行类型/格式验证和强制。换句话说,您必须在插入db之前处理这个问题。应该如何进行跨字段验证?例如:模型有开始日期和结束日期,我想确保开始日期应该小于结束日期。@akshar我已经有一段时间没有使用引擎了,但根据我的回答,我相信验证器
不是用于交叉验证,而只是在必要时进行类型/格式验证和强制。换句话说,您必须在插入db之前处理这个问题。应该如何进行跨字段验证?例如:模型有开始日期和结束日期,我想确保开始日期应该小于结束日期。如何进行跨域验证?例如:模型有开始日期和结束日期,我想确保开始日期应该小于结束日期。