我想创建一个识别IDN的验证码验证程序以在我的一个项目中使用。我使用了Django项目中的一部分代码(http://code.djangoproject.com/svn/django/trunk/django/core/validators.py)来做到这一点,但是我的代码中必须有一个微不足道的错误I找不到:电子邮件验证码验证程序出错
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
当我尝试验证与IDN域名(例如:[email protected]ääl.de)的电子邮件后,第一个电话提出的无效抛出异常,以及代码之后的部分第一个除外从不执行('heywo!'从不打印)。
有一个例子:
>>> from test.lib.validators import Email
>>> Email().to_python(u'[email protected]ää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)
我做了什么错?
谢谢。
请编辑文章,包括你的错误得到堆栈跟踪。 – Daenyth 2010-09-28 00:05:47
我加了痕迹。正如我所说,这只是我期望通过调用_original_ Email验证程序的结果。事实并非如此:/ – Pierre 2010-09-28 00:14:09
我会在跟踪报告的validators.py中查看第1352行。我怀疑是谁让这个模块不能正确处理unicode域部分。我也不完全确定他们是有效的,但他们可能很容易(我没有足够的知识)。它是否会在您删除unicode时进行验证? – Daenyth 2010-09-28 00:20:49