2012-08-13 133 views
9

我在表單中使用的Django URLValidator以下列方式:Django的URLValidator產生虛假錯誤

def clean_url(self): 
    validate = URLValidator(verify_exists=True) 
    url = self.cleaned_data.get('url') 

    try: 
     logger.info(url) 
     validate(url) 
    except ValidationError, e: 
     logger.info(e) 
     raise forms.ValidationError("That website does not exist. Please try again.") 

    return self.cleaned_data.get('url') 

這似乎與某些URL的,但對於一些有效的那些工作,它失敗。我能夠檢查http://www.amazon.com/這是失敗的(這顯然是不正確的)。它通過http://www.cisco.com/。是否有任何原因造成虛假錯誤?

回答

8

看看the source for URLValidator;如果指定check_exists,它使HEAD請求URL,以檢查它是否是有效的:

req = urllib2.Request(url, None, headers) 
req.get_method = lambda: 'HEAD' 
... 
opener.open(req, timeout=10) 

嘗試使HEAD請求亞馬遜自己,你會看到這個問題:

[email protected]:~$ HEAD http://www.amazon.com 
405 MethodNotAllowed 
Date: Mon, 13 Aug 2012 18:50:56 GMT 
Server: Server 
Vary: Accept-Encoding,User-Agent 
Allow: POST, GET 
... 

我看不出解決這個問題的辦法,除了猴子補丁或其他方式擴展URLValidator以使用GETPOST請求;在做之前,你應該仔細考慮是否使用check_exists(沒有這個問題應該消失)。作爲core/validators.py本身說,

「的URLFieldverify_exists參數有棘手的安全和性能問題。因此,這種模式已經過時。」

你會發現Django的開發版本確實完全處理了這個功能。

+3

+1表示棄用。 – 2012-08-13 19:02:10