验证电子邮件本地组件
我正在写一个注册表单,只需要接受所需电子邮件地址的本地组件。 域组件固定在该站点上。 我试图通过有选择性地复制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- 10 13 14 16- 37!#-[]-177]|[ 01- 11 13 14 16-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