Python AppEngine,EmailProperty不能为空

时间:2016-03-28 00:54:48

标签: python python-2.7 google-app-engine google-app-engine-python

我正在使用Flask构建基于表单的应用程序,并遇到可选电子邮件字段的问题。

有没有办法设置object B类型的数据存储区域并允许它为空?即使在实体定义中使用EmailProperty(),它仍然会引发required=False字段BadValueError

must not be empty

在Python客户端的最新几个版本中,在第879行的# my entity definition from google.appengine.ext import db class Model(db.Model): email = db.EmailProperty(required=False) 中,Email类的google_appengine/google/appengine/api/datastore_types.py调用如下所示:

__init__

它将执行传递给ValidateString,后者有一个empty_ok布尔参数,默认为class Email(unicode): def __init__(self, email): super(Email, self).__init__() ValidateString(email, 'email')

False

如果将get设置为我的def ValidateString(value, name='unused', exception=datastore_errors.BadValueError, max_len=_MAX_STRING_LENGTH, empty_ok=False): 字段的EmailProperty参数设置为的反转,那就太好了。例如,在我的实体定义中,由于我有required=,如果此电子邮件类在调用required=False时可以将True传递到empty_ok参数,那就太好了。但是,既然没有,我真的想找出一个好的解决方法。

我不能成为那里曾经尝试存储可选电子邮件地址字段的唯一开发人员吗?如果数据在我的表单上传递,我仍然希望运行内置验证,所以如果我能帮助它,我不想更改为ValidateString() ...

2 个答案:

答案 0 :(得分:1)

N.B。:db模块早已被ndb模块取代。 db几年来没有收到任何重大更新。我真的建议尽可能更新,但尽管有一些想法可以解决它。

正如您已确定的那样,Email类不会允许空值。可能这里最简单的事情就是定义你自己的类类和属性类来代替EmailProperty

    from google.appengine.ext import db


    class EmailOrNone(datastore_types.Email):
        def __init__(self, email):
            super(EmailOrNone, self).__init__(email)
            ValidateString(email, 'email', empty_ok=True)


    class EmailOrNoneProperty(db.EmailProperty):
        data_type = EmailOrNone

然后只需使用新EmailOrNoneProperty代替EmailProperty

您也可以将StringPropertycustom validator一起使用。

免责声明:我没有测试过这段代码,但这个想法很合理。

答案 1 :(得分:0)

如果只提供电子邮件,那么只调用验证功能呢?

class Email(unicode):
    def __init__(self, email):
        super(Email, self).__init__()
        if email != "":
            ValidateString(email, 'email')

注意我故意转向if email != ""而不是更加pythonic if email,以便如果用户提供评估为False的非空“电子邮件”,则会赢得“导致跳过字符串验证。