خطأ عند التحقق من صحة البريد الإلكتروني

StackOverflow https://stackoverflow.com/questions/3808698

  •  25-09-2019
  •  | 
  •  

سؤال

كنت أرغب في إنشاء مدقق فورمنيود مدرك لـ 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 (على سبيل المثال: 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)

أي خطأ ارتكبت ؟

شكرًا.

هل كانت مفيدة؟

المحلول

حسنًا ، وجدت الجواب. كنت زائد _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

إنه يعمل بشكل مثالي :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top