2014-05-12 2 views
0

사용자가 중복 URL을 데이터베이스에 제출할 수 없도록하고 싶습니다.web2py : SQLFORM URL 중복 확인

는 지금 나의 접근 방식은 다음과 같습니다

db.url.URL.requires=[IS_URL(error_message='URL Error'), 
        IS_NOT_IN_DB(db, 'url.URL',error_message='Dupilcated URL')] 

그것은 "HTTP"에 대한 사례를 설명하고 "HTTP"없이. 예를 들어 www.123.com이 이미 데이터베이스에있는 경우 사용자는 http://www.123.com을 제출할 수 없습니다. 하지만이 방법은 "https"로 대소 문자를 구분하지 않습니다. 즉 사용자는 여전히 https://www.123.com을 제출할 수 있습니다.

그런 중복을 방지하기위한 방법이 있습니까?

SQLFORM(). process()를 호출하기 전에 url에 "http"/ "https"가 있으면 제거하는 것이 좋습니다. 그런 식으로 데이터베이스의 URL은 모두 "http"/ "https"가 없습니다. 하지만 SQLFORM(). process()를 호출하기 전에 사용자 입력을 편집하는 방법을 모르겠습니다.

는 지금 내 코드는

url_form=SQLFORM(db.url).process() 

어떤 아이디어가?

감사합니다.

답변

1

당신은 추가 처리하기 전에 HTTP/HTTPS를 제거하기 위해 사용자 정의 유효성 검사기를 만들 수 있습니다

import re 
db.url.URL.requires = [lambda url: (re.sub(r'http[s]?://', '', url), None), 
         IS_URL(error_message='URL Error'), 
         IS_NOT_IN_DB(db, 'url.URL',error_message='Dupilcated URL')] 

참고 사용자 지정 유효성 검사기가 변경된 URL 및 None합니다 (None가 있음을 나타냅니다 포함 튜플을 반환있다 오류 없음). 변경된 URL은 나머지 두 개의 유효성 검사기로 전달됩니다.

기본적으로 IS_URL은 체계가없는 모든 URL에 "http : //"를 붙입니다 (이 경우 모든 URL이됩니다. 첫 번째 유효성 검사기가 구성표를 제거하기 때문에). 해당 동작을 억제하려면 IS_URL(prepend_scheme=None)을 사용할 수 있습니다.

+0

고마워요! 그것은 작동합니다. 나는 람다를 여러 번 본 적이 있지만 실제로 어떻게 작동하는지 결코 이해하지 못합니다. – fuiiii

1

데이터베이스의 http 및 https 버전을 모두 확인하는 custom validator을 만들 수 있습니다. 또한 URL 서식을 지정할 수 있습니다. 모든 소문자 호스트 이름과 키워드의 키워드 인수 (?a=b)를 URL에서 제거하십시오. 그렇게 할 계획이라면 urlparse을 확인하십시오.

다음 코드는 테스트되지 않았지만 자신 만의 솔루션을 만들 수있는 충분한 코드를 제공 할 수 있습니다.

class scheme_independant_url_is_not_in_db: 
    def __init__(self, db,error_message='Duplicate URL'): 
     self.db = db 
     self.e = error_message 

    def __call__(self, value): 
     # test the entered uri 
     url_validator = IS_NOT_IN_DB(db,'url.URL') 
     value, error = url_validator(value) 
     if error: 
      return value,self.e 
     # find the opposing scheme 
     if value.lower().startswith('http:'): 
      opposite_scheme_value = 'https:'+value[5:] 
     elif value.lower().startswith('https:') 
      opposite_scheme_value = 'http:'+value[6:] 
     # error on the opposite_scheme_value in db 
     value, error = url_validator(opposite_scheme_value) 
     if error: 
      return value,self.error_message 
     # return the original url, preserving the original scheme 
     return (value, None) 
... 

db.url.URL.requires=[IS_URL(error_message='URL Error'), 
       scheme_independant_url_is_not_in_db(db)] 
+0

고맙습니다. 코드는 매우 이해하기 쉽습니다. – fuiiii

+0

일부 웹 사이트에서 다른 콘텐츠를 제공하거나 액세스하기 어려울 수 있다는 이유로 스킴을 삭제하지 않는 것이 좋습니다. – Remco

+0

좋은 지적입니다! 나는 그것에 대해 전에 생각하지 않았다. 감사! – fuiiii