【问题标题】:django EmailField point before @django EmailField 指向@之前
【发布时间】:2015-01-18 02:29:21
【问题描述】:

我对 django EmailField 也有同样的小问题。

forms.EmailField(required=True, label="E-mail", widget=forms.TextInput(attrs=

它不接受表单中的电子邮件

xx.@xxxxxxx.xxx

它会返回格式不正确的错误消息,但电子邮件正常工作(电子邮件已使用 15 年)。 我认为 at-sign 之前的点是问题所在。

这是一个错误吗?是否有任何解决方案使其适用于此类电子邮件?

非常感谢:)

【问题讨论】:

  • 如果是bug,请submit a ticket。我会等其他人先插话。
  • 根据标准,该位置的一个点实际上可能是无效的,即使它总是对您有用。有人将不得不搜索 RFC 2821 左右并确定它是否是 Django 中的错误。
  • 你能添加你得到的Error吗?

标签: python django emailfield


【解决方案1】:

RFC 5321,第 4.2.1 节中,地址的“本地部分”具有以下语法:

Local-part     = Dot-string / Quoted-string
                 ; MAY be case-sensitive


Dot-string     = Atom *("."  Atom)

Atom           = 1*atext

我的解释是,Atom 必须至少有一个字符,Dot-string 是一个或多个 Atom,它们之间有点,Local-part 是 Dot-string 或 Quoted-字符串。

如果我解释正确,那么一个原子必须始终跟在一个点之后,您的电子邮件地址正式无效,例如连续两个点也是无效的。

尽管像 GMail 这样的服务器选择只过滤掉本地部分的所有点并接受这些地址,但这并不意味着它们正式有效。

引用本地部分 ("xx."@xxxx.xxx) 应该可以,但您也可以编写自定义验证器和您自己的 EmailField 子类。

【讨论】:

    【解决方案2】:

    EmailField 是一个 CharField,用于检查该值是否为有效的电子邮件地址。它使用EmailValidator 来验证输入。

    EmailValidator 类按此行拆分您的电子邮件:

    user_part, domain_part = value.rsplit('@', 1) 
    

    因此 user_part@ 之前的部分。和EmailValidator 通过这个正则表达式检查它的验证:

    user_regex = re.compile(
        r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*$"  # dot-atom
        r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"$)',  # quoted-string
        re.IGNORECASE)
    

    正如您所见,\. 不可能出现在 @ 之前,有一个 \. 紧随其后的是 [-!#$%&'*+/=?^_`{}|~0-9A-Z]+!所以\.没有机会了!!!

    【讨论】:

      【解决方案3】:

      正如其他人所说,这可能不是一个有效的电子邮件地址。但作为一种解决方法,你可以做这样的事情。我没有把正则表达式放进去,但希望你明白:

      from django.core.validators import EmailValidator
      from django.db import models
      
      class MyEmailValidator(EmailValidator):
          user_regex = re.compile('ALTERED REGULAR EXPRESSION')
      
      class MyModel(models.Model):
          forms.EmailField(required=True, label="E-mail", validators=[MyEmailValidator()])
      

      您可以查看 django.core.validators.EmailValidator 了解如何制作正则表达式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 1970-01-01
        • 2013-02-08
        • 2015-05-21
        • 2015-08-29
        • 2015-01-13
        • 2011-06-26
        相关资源
        最近更新 更多