2012-08-13 12 views
9

Używam Django URLValidator w następujący sposób w postaci:Django URLValidator produkowane błędy fałszywych

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') 

wydaje się działać z niektórymi url ale dla niektórych ważnych nich, to się nie powiedzie. Udało mi się sprawdzić przy pomocy http://www.amazon.com/, że się nie udało (co jest oczywiście nieprawidłowe). Przechodzi z http://www.cisco.com/. Czy istnieje jakiś powód do fałszywych błędów?

Odpowiedz

8

Spójrz na the source for URLValidator; jeśli podasz check_exists, to sprawia, że ​​HEAD żądanie do adresu URL, aby sprawdzić, czy jest to prawidłowy:

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

Spróbuj dokonywania HEAD prośbę do Amazon siebie, a zobaczysz problem:

[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 
... 

Nie widzę sposobu rozwiązania tego problemu poza poprawianiem małpki lub rozszerzaniem w inny sposób, aby użyć żądania lub ; zanim to zrobisz, powinieneś pomyśleć o tym, czy w ogóle korzystać z check_exists (bez którego ten problem powinien zniknąć). Jak sama mówi, core/validators.py

„The URLFieldverify_exists argumentem ma problemy trudne do rozwiązania zabezpieczeń i wydajności. W związku z tym została zaniechana”.

Przekonasz się, że wersja deweloperska Django rzeczywiście całkowicie zrezygnowała z tej funkcji.

+3

+1 za wskazanie wycofania. –

Powiązane problemy