2012-08-13 17 views
9

estoy usando el Django URLValidator de la siguiente manera en una forma:Django URLValidator producido errores falsos

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

Parece que funciona con un poco de url pero para algunos válidos, falla. Pude comprobar con http://www.amazon.com/ está fallando (que es obviamente incorrecto). Pasa con http://www.cisco.com/. ¿Hay alguna razón para los errores falsos?

Respuesta

8

Mire the source for URLValidator; si especifica check_exists, se hace una petición HEAD a la dirección URL para comprobar si es válida:

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

trate de hacer la solicitud HEAD a Amazon a sí mismo, y podrás ver el problema:

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

No puedo ver una forma de resolver esto aparte de la aplicación de parches o extender URLValidator para usar una solicitud GET o POST; antes de hacerlo, debe pensar detenidamente si debe usar check_exists (sin lo cual este problema debería desaparecer). Como core/validators.py mismo dice,

"El argumento URLFieldverify_exists tiene problemas de seguridad y de rendimiento insuperable. En consecuencia, ya no se utiliza."

Descubrirá que la versión en desarrollo de Django ha eliminado completamente esta característica.

+3

+1 para señalar la depreciación. –

Cuestiones relacionadas