2012-09-10 8 views
-1

원하는 전자 메일 주소의 로컬 구성 요소 만 받아 들일 필요가있는 등록 양식을 작성하고 있습니다. 도메인 구성 요소가 사이트에 고정됩니다. 나는 선택적으로 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'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\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 : 그래서 양식 필드와 레이블은 다음과 같이 표시됩니다

원하는 이메일 주소 : [--- 유형-수 영역 ---] @ domain.com

+0

전자 메일을 정상적으로 확인한 다음'email.endswith ('@ domain.com') '을 확인하지 않는 이유는 무엇입니까? – Blender

+0

사용자가 @ domain.com을 입력하지 않아 양식의 필드 뒤에 레이블로 설정됩니다. 사용자는 @ – DanH

+2

앞에 기본적으로 이메일 필드의 첫 부분 만 입력하면됩니다. [^ @] * "'? –

답변

2

어떤 사람들을 문제가 발생하면 "나는 알고 있습니다. 나는 정규식을 사용합니다."이제는 두 가지 문제가 있습니다. - Jamie Zawinski

정규식을 통해 확인하는 것은 시간을 낭비하는 연습입니다. 가장 좋은 방법은 배송을 시도하는 것입니다. 이 방법은 전자 메일 주소를 확인할 수있을뿐만 아니라 사서함이 실제로 활성화되어 있고 전자 메일을받을 수 있는지 여부도 확인할 수 있습니다.

그렇지 않으면 모든 rules과 (과) 일치 할 것으로 기대할 수없는 모든 확장 정규식으로 끝납니다.

"Haha boo hoo woo woo!"@foo.com

는 거의 표준 "우리는 당신의 주소를 확인 [email protected]에 보낸 이메일에있는 링크를 클릭하십시오.", 제공 그래서 대신 [email protected]

이며, 유효한 주소입니다 접근.

전자 메일 주소를 만들려면 전자 메일 구성 요소의 일부가 될 수있는 항목에 대한 자체 규칙을 작성할 수 있습니다. 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!' 
+0

내가 제일 좋아하는 따옴표 중 하나입니다 ... –

+0

이것은 전자 메일 계정, 아니 – DanH

+1

그럼 당신은 좋은 짧은 쉬운 정규식에서 허용되지 않는 것에 대한 자신의 규칙을 작성할 수 있습니다 ... 그 괴물에 대한 필요가 없습니다 ... –

2

당신은 "같은 ?와 같은 바람직하지 않은 자"라고,하지만 난 당신이 원하는 어떤 문자에 대한 잘못된 것 같아요. 원래 정규식은 물음표를 허용합니다.

대용량 정규 표현식을 사용하지 않고 논리를 나중에 디코딩 할 수있는 자체 유효성 검사기를 정의 할 수도 있습니다.

+0

이메일의 유효한 사용자 부분은 꽤 열려 있습니다 ... 나는 다른 대답에 동의합니다. 정규식은 아마도 적절하지 않을 것입니다 ... 그리고 확실히 미친 큰 것은 아닙니다 –

+0

이것은 전자 메일 계정 생성을위한 것이기 때문에, 허용 된 문자를 사양이 허용하는 것 이상으로 단순히 제한 한 다음 더 간단한 유효성 검사기를 작성할 수 있습니다. 또한, 오! – DanH

0

regex를 사용하여 100 % 올바르게 수행하려면 중첩 된 괄호를 허용하는 확장 된 정규식의 엔진을 사용해야합니다.

파이썬의 기본 엔진은 이것을 허용하지 않으므로 매우 단순한 (허용하는) 정규 표현식으로 손상되지 않는 것이 좋습니다.

+0

regex 정의에 의해 중첩 된 아무것도 일치하지 ... 당신은 그 (또는 메모리의 일부 양식)에 대한 스택이 필요합니다 ... 중첩 된 항목과 일치시킬 수있는 파이썬 정규식 모듈이 있습니까? –

+0

올바른 주소인지 확인하기 위해 괄호를 일치시켜야합니까? –

+0

@ JoranBeasley : 예, 'extended regex'에 의해이 작업을 수행 할 수있는 .NET 또는 Perl과 같은 엔진을 나타냅니다. 파이썬 정규식에 대한 PCRE와 같은 인터페이스가 있는지 잘 모르겠습니다. – porges

1

저는 Django와 Python을 처음 접했지만 왜 바퀴를 다시 만들고 자신의 정규식을 유지합니까? 떨어져 이메일 주소의 로컬 부분을 입력하는 사용자가 원하는에서, 당신은 장고의 행복 경우 내장 EmailField, 당신은 아주 쉽게 그 하위 클래스와 유효성 검사 논리를 조금 조정할 수 있습니다

DOMAIN_NAME = u'foo.com' 


class LocalEmailField(models.EmailField): 
    def clean(local_part): 
     whole_address = '%[email protected]%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() method에 대한 설명서를 보았습니까?

+0

많은 사람들이 사용자 지정 필드의 요구 사항을 놓치고있는 것처럼 보입니다. 즉, 원하는 전자 메일 주소의 사용자 이름 섹션을 입력하기위한 것입니다. 예를 들어,'USER @ DOMAIN.COM'에서, 사용자는'USER' 만 입력 할 것입니다. 당신은 바로 현장 유효성 검사를 살펴보고 더 깨끗한 방법으로 머리를 써야합니다. :) – DanH

+0

내가 중요한 것을 놓치지 않는다면 이것은 정확히 당신의 요구 사항을 충족시켜야합니다. 그러나 올바른 사용자 이름을 구성하는 것을 정확히 정의하기 위해 농구를 뛰어 넘기보다는 양식 입력으로 "USER"를 수락하고 "@ DOMAIN.COM"을 추가하여 전체 주소의 유효성을 검사하는 간단한 방법이 필요합니다 Django의 내장 필드를 사용하고,''USER''를 반환합니다. – akshayshah

관련 문제