2014-05-12 116 views
0

我想禁止用戶能夠提交重複的網址到數據庫中。web2py:SQLFORM網址重複驗證

現在我的做法是:

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」,如果有的話。通過這種方式,數據庫中的網址都沒有「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會將「http://」加入任何缺少方案的URL(在這種情況下將是所有URL,因爲第一個驗證器會剝離該方案)。要抑制此行爲,您可以執行IS_URL(prepend_scheme=None)

+0

謝謝!有用。我已經看過幾次lambda,但我從來沒有真正理解它是如何工作的。 – fuiiii

1

您可以創建一個custom validator,它將檢查數據庫中的http和https版本。這也允許格式化URL。考慮URL中的所有小寫主機名和刪除關鍵字參數(?a=b)。如果您打算這麼做,一定要查看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