Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Google NDB模型验证_Python_Google App Engine_Google Cloud Datastore_App Engine Ndb - Fatal编程技术网

Python Google 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() 我想

如何在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()

我想验证属性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之前处理这个问题。应该如何进行跨字段验证?例如:模型有开始日期和结束日期,我想确保开始日期应该小于结束日期。如何进行跨域验证?例如:模型有开始日期和结束日期,我想确保开始日期应该小于结束日期。