2012-08-13 7 views
9

Sto utilizzando il Django URLValidator nel modo seguente in forma:django URLValidator ha prodotto errori fasulli

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

Sembra funzionare con alcuni URL, ma per alcuni tra quelli validi, non riesce. Sono stato in grado di verificare con http://www.amazon.com/ che non funziona (che è ovviamente errato). Passa con http://www.cisco.com/. C'è qualche ragione per gli errori fasulli?

risposta

8

Vedere the source for URLValidator; se si specifica check_exists, fa una richiesta di HEAD all'URL per verificare se è valida:

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

provare a fare la richiesta HEAD ad Amazon te stesso, e potrai vedere il 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 
... 

Non riesco a vedere un modo per risolvere questo diverso da patch di scimmia o estendere in altro modo URLValidator per utilizzare una richiesta GET o POST; prima di farlo, dovresti riflettere attentamente sull'uso di check_exists (senza il quale questo problema dovrebbe andare via). Come core/validators.py si dice,

"L'argomento URLFieldverify_exists ha problemi di sicurezza intrattabile e prestazioni. Di conseguenza, è stato sconsigliato."

Troverete che la versione in sviluppo di Django ha infatti smaltito completamente questa funzione.

+3

+1 per indicare la richiesta. –

Problemi correlati