电子邮件表单编码验证器错误
我想为我的一个项目创建一个支持国际化域名(IDN)的表单验证器。为此,我使用了Django项目中的一部分代码(http://code.djangoproject.com/svn/django/trunk/django/core/validators.py),但是我的代码里似乎有个小错误,我找不到。
class Email(formencode.validators.Email):
def _to_python(self, value, state):
try:
return super(Email, self)._to_python(value, state)
except formencode.Invalid as e:
# Trivial case failed. Try for possible IDN domain-part
print 'heywo !'
if value and u'@' in value:
parts = value.split(u'@')
try:
parts[-1] = parts[-1].encode('idna')
except UnicodeError:
raise e
try:
super(Email, self)._to_python(u'@'.join(parts), state)
except formencode.Invalid as ex:
raise ex
return value
else:
raise e
当我尝试验证一个带有国际化域名的邮箱(比如:test@wääl.de)时,第一次调用时抛出的无效异常会被触发,而在第一次捕获异常后的代码部分却从来没有执行过('heywo !' 这句话从来没有被打印出来)。
这里有个例子:
>>> from test.lib.validators import Email
>>> Email().to_python(u'test@zääz.de')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.6/dist-packages/FormEncode-1.2.3dev-py2.6.egg/formencode /api.py", line 416, in to_python
vp(value, state)
File "/usr/local/lib/python2.6/dist-packages/FormEncode-1.2.3dev-py2.6.egg/formencode /validators.py", line 1352, in validate_python
value, state)
Invalid: The domain portion of the email address is invalid (the portion after the @: z\xe4\xe4z.de)
我到底做错了什么呢?
谢谢。
1 个回答
0
好的,我找到了答案。我之前把 _to_python
这个方法搞错了,应该用 validate_python
。现在这个类看起来是:
class Email(formencode.validators.Email):
def validate_python(self, value, state):
try:
super(Email, self).validate_python(value, state)
except formencode.Invalid as e:
# Trivial case failed. Try for possible IDN domain-part
if value and u'@' in value:
parts = value.split(u'@')
try:
parts[-1] = parts[-1].encode('idna')
except UnicodeError:
raise e
try:
super(Email, self).validate_python(u'@'.join(parts), state)
except formencode.Invalid as ex:
raise ex
else:
raise e
现在运行得非常好 :)