验证电子邮件本地组件

我正在写一个注册表单,只需要接受所需电子邮件地址的本地组件。 域组件固定在该站点上。 我试图通过有选择性地复制Django为EmailField提供的validators.validate_email来验证它:

email_re = re.compile(
    r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"  # dot-atom
    # quoted-string, see also http://tools.ietf.org/html/rfc2822#section-3.2.5
    r'|^"([01-10131416-37!#-[]-177]|[01-11131416-177])*"'
    r')@((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?.)+[A-Z]{2,6}.?$)'  # domain
    r'|[(25[0-5]|2[0-4]d|[0-1]?d?d)(.(25[0-5]|2[0-4]d|[0-1]?d?d)){3}]$', re.IGNORECASE)  # literal form, ipv4 address (SMTP 4.1.3)
validate_email = EmailValidator(email_re, _(u'Enter a valid e-mail address.'), 'invalid')

以下是我的代码。 我的主要问题是我无法修改正则表达式。 在这一点上,我只是在http://www.pythonregex.com/上的正则表达式测试中测试它,但它失败了:

^([-!#$%&'*+/=?^_`{}|~0-9A-Z]+(.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*)$

这似乎是传递不受欢迎的字符,如?

整个代码为我的领域,这不一定在这个阶段相关,但我不介意对它的一些评论将是:

class LocalEmailField(CharField):    
    email_local_re = re.compile(r"^([-!#$%&'*+/=?^_`{}|~0-9A-Z]+(.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*)$", re.IGNORECASE)
    validate_email_local = RegexValidator(email_re, (u'Enter a valid e-mail username.'), 'invalid')
    default_validators = [validate_email_local]

编辑:为了澄清,用户只输入了@之前的文本,因此为什么我不需要在验证器中验证@domain.com

编辑2:所以表单域和标签将如下所示:

期望的电子邮件地址:[--- type-able area ---] @ domain.com


你说“不受欢迎的人物如? ”,但我认为你误解了哪些人物是可取的。 原始的正则表达式允许问号。

请注意,您也可以定义您自己的验证器,该验证器不使用大量的正则表达式,并且稍后有机会解码逻辑。


有些人遇到问题时会想:“我知道,我会用正则表达式。”现在他们有两个问题。 - 杰米Zawinski

通过正则表达式检查是浪费时间的练习。 最好的方法是尝试交付; 这样,您不仅可以验证电子邮件地址,还可以验证邮箱是否处于活动状态并可以接收电子邮件。

否则,你最终会得到一个不可能希望匹配所有规则的扩展正则表达式。

"Haha boo hoo woo woo!"@foo.com是一个有效的地址, qwerterukeriouo@gmail.com "Haha boo hoo woo woo!"@foo.com qwerterukeriouo@gmail.com也是qwerterukeriouo@gmail.com

相反,请提供几乎标准的“请点击我们发送给blahblah@goo.com的电子邮件中的链接以验证您的地址。” 做法。

如果你想创建电子邮件地址,那么你可以编写你自己的规则,可以成为电子邮件组件的一部分; 并且它们可以是RFC中正式允许的字符的子集。

例如,保守规则(不使用正则表达式):

allowed_chars = [string.digits+string.letters+'-']

if len([x in user_input if x not in allowed_chars]):
   print 'Sorry, invalid characters'
else:
   if user_input[0] in string.digits+'-':
      print 'Cannot start with a number or `-`'
   else:
      if check_if_already_exists(user_input):
         print 'Sorry, already taken'
      else:
         print 'Congratulations!'

我对Django和Python仍然很陌生,但为什么要重新发明轮子并维护自己的正则表达式? 如果除了希望用户仅输入其电子邮件地址的本地部分外,您还对Django内置的EmailField感到满意,您可以轻松进行子类化,并稍微调整验证逻辑:

DOMAIN_NAME = u'foo.com'


class LocalEmailField(models.EmailField):
    def clean(local_part):
        whole_address = '%s@%s' % (local_part, DOMAIN_NAME)
        clean_address = super(LocalEmailField, self).clean(whole_address)
        # Can do more checking here if necessary
        clean_local, at_sign, clean_domain = clean_address.rpartition('@')
        return clean_local

你看过表单和字段验证以及.clean()方法的文档吗?

链接地址: http://www.djcxy.com/p/92683.html

上一篇: Validate email local component

下一篇: Consequences of not using server side validation?