验证wtfforms中的美国电话号码

时间:2016-03-27 18:41:24

标签: python flask wtforms

我正在使用烧瓶应用并使用wtforms:

class RegisterForm(Form):
    username = StringField('Username', validators=[DataRequired(), Length(min=3, max=25)])
    email = StringField('Email', validators=[DataRequired(), Email(), Length(min=6, max=40)])
    phone = StringField('Phone', validators=[DataRequired(), Length(10)])

我刚刚添加手机,正在寻找验证美国号码的方法。我遇到http://wtforms-components.readthedocs.org/en/stable/#phonenumberfield,但这似乎不再有phonenumberfield了。什么是使用wtfforms处理此问题的最佳方法?

编辑课程:

class RegisterForm(Form):
    username = StringField('Username', validators=[DataRequired(), Length(min=3, max=25)])
    email = StringField('Email', validators=[DataRequired(), Email(), Length(min=6, max=40)])
    phone = StringField('Phone', validators=[DataRequired(),validate_phone('RegisterForm','phone'), Length(min=6, max=40)])

    def validate_phone(form, field):
        if len(field.data) > 16:
            raise ValidationError('Invalid phone number.')
        try:
            input_number = phonenumbers.parse(field.data)
            if not (phonenumbers.is_valid_number(input_number)):
                raise ValidationError('Invalid phone number.')
        except:
            input_number = phonenumbers.parse("+1"+field.data)
            if not (phonenumbers.is_valid_number(input_number)):
                raise ValidationError('Invalid phone number.')

3 个答案:

答案 0 :(得分:7)

我在最近的一个应用程序中使用了python-phonenumbers。它使用谷歌电话号码解析的东西。以下是我如何使用它:

from wtforms import ValidationError
import phonenumbers

class RegisterForm(Form):
    username = StringField('Username', validators=[DataRequired(), Length(min=3, max=25)])
    email = StringField('Email', validators=[DataRequired(), Email(), Length(min=6, max=40)])
    phone = StringField('Phone', validators=[DataRequired()])

    def validate_phone(form, field):
        if len(field.data) > 16:
            raise ValidationError('Invalid phone number.')
        try:
            input_number = phonenumbers.parse(field.data)
            if not (phonenumbers.is_valid_number(input_number)):
                raise ValidationError('Invalid phone number.')
        except:
            input_number = phonenumbers.parse("+1"+field.data)
            if not (phonenumbers.is_valid_number(input_number)):
                raise ValidationError('Invalid phone number.')

答案 1 :(得分:1)

我利用了PhoneNumberField组件中的内置wtforms。这是我的用法。

from wtforms_components import PhoneNumberField

class UserForm(Form):
    phone_number = PhoneNumberField(
        country_code='US'
        display_format='national'
    )

答案 2 :(得分:0)

我没有足够的声誉来发表评论,但是公认的解决方案在许多情况下都会引发未捕获的异常。这是由于以下行为(从电话号码文档复制):

  

对于无法唯一解析或可能不是电话号码的输入,解析功能也将完全失败(带有NumberParseException)。

失败的字符串示例为“ 1”,“ 2”和“ abcde”。

以下是wgwz答案的修改形式,对这种情况有很强的作用:

con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");