2011-04-08 10 views
6

Qualcuno potrebbe chiarirmi perché questo URL http://www.nacolmeia.com.br/do/Home/oferta/EnER non viene accettato in un modulo generato da Django di URLField?Problema con l'URL Field Test di Django

:)

Grazie

+0

Non correlato a questo caso specifico, ma ho trovato che django considera gli URL non validi se rifiutano una richiesta HEAD. Ad esempio qualsiasi cosa ospitata da wix.com (www.wehaveavoice.org.uk). – Julian

risposta

7

Stai ospita il sito dallo stesso server che si sta tentando di convalidare su? docs

Note that when you're using the single-threaded development server, validating a URL being served by the same server will hang. This should not be a problem for multithreaded servers.

Non sembra come il suo convalida in mancanza a livello di modulo

>>> from django import forms 
>>> f = forms.URLField() 
>>> f.clean('http://www.nacolmeia.com.br/do/Home/oferta/EnER') 
u'http://www.nacolmeia.com.br/do/Home/oferta/EnER' 
>>> f.clean('sadfas') 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/dev/.virtualenvs/thepidb/lib/python2.7/site-packages/django/forms/fields.py", line 171, in clean 
    self.run_validators(value) 
    File "/home/dev/.virtualenvs/thepidb/lib/python2.7/site-packages/django/forms/fields.py", line 160, in run_validators 
    raise ValidationError(errors) 
ValidationError: [u'Enter a valid URL.'] 
>>> 

Se non è necessario verificare che il sito web non restituisce un 404, nei modelli. py

url = models.URLField(verify_exists=False) 

edit:

dopo aver scavato nel codice sorgente di django here e aver fatto un po 'di casino con la shell, non sono ancora sicuro del motivo per cui l'URL con cap sta causando un ciclo di reindirizzamento.

>>> from django.core.validators import URLValidator 
>>> u = URLValidator(verify_exists=True) 
>>> u.__call__('http://www.nacolmeia.com.br/do/Home/oferta/EnER') 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/dev/.virtualenvs/thepidb/lib/python2.7/site-packages/django/core/validators.py", line 105, in __call__ 
    raise broken_error 
ValidationError: [u'This URL appears to be a broken link.'] 
>>> u.__call__('http://www.nacolmeia.com.br/do/home/oferta/ener') 
>>> 

L'eccezione effettivo che viene sollevata è un HTTPError:

File "/usr/lib/python2.7/urllib2.py", line 606, in http_error_302 
    return self.parent.open(new, timeout=req.timeout) 
    File "/usr/lib/python2.7/urllib2.py", line 398, in open 
    response = meth(req, response) 
    File "/usr/lib/python2.7/urllib2.py", line 511, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/usr/lib/python2.7/urllib2.py", line 430, in error 
    result = self._call_chain(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 370, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 606, in http_error_302 
    return self.parent.open(new, timeout=req.timeout) 
    File "/usr/lib/python2.7/urllib2.py", line 398, in open 
    response = meth(req, response) 
    File "/usr/lib/python2.7/urllib2.py", line 511, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/usr/lib/python2.7/urllib2.py", line 430, in error 
    result = self._call_chain(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 370, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 596, in http_error_302 
    self.inf_msg + msg, headers, fp) 
HTTPError: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop. 
The last 30x error message was: 
Found 
>>> 

qui sono alcuni post che parlano del HTTPError: here e here

sembra che abbia qualcosa a che fare con i biscotti, ma Non sono in grado di offrire una buona spiegazione, lo lascerò a qualcun altro.

Una soluzione alternativa che potrebbe funzionare se non si desidera disattivare la convalida ma non si preoccupa della capitalizzazione dei propri url è di ignorare il metodo clean_field dei moduli.

def clean_your_url_field(self): 
    return self.cleaned_data['your_url_field'].lower() 
+0

Ulteriori test hanno dimostrato che il problema erano i caratteri maiuscoli ... Dovrebbe essere in questo modo? – Rodrogo

+0

cosa intendi? funziona se minuscolo tutte le lettere? – DTing

+0

Sì. (scusate, utente inglese di seconda lingua). Quando l'URL è stato messo in minuscolo, il modulo lo ha accettato. – Rodrogo

0

Penso di aver trovato il problema. Quando si apre questo URL:

http://www.nacolmeia.com.br/do/Home/oferta/EnER

... ri-indirizza a questo URL:

http://www.nacolmeia.com.br/do/Home/oferta/EnER/piracicaba/a-pascoa-chegou-na-planet-chokolate!-50-off-para-1-caixa-com-16-bombons-recheados--1-pao-de-mel-recheado-ou-1-caixa-com-16-trufas-recheadas--1-pao-de-mel-recheado-de-rs-47.10-por-rs-23.55.

Il primo URL va bene, ma quello reindirizzato è lungo 247 caratteri. Questo "non dovrebbe" essere un problema, ad eccezione del fatto che models.fields.URLField ha max_length che per impostazione predefinita è caratteri. Quindi fallisce la convalida perché è troppo lunga.

Invece, aumentare il max_length e dovrebbe funzionare: models.URLField(max_length=255) Per informazioni sull'URL più lungo possibile, see this SO question. Comunque è sicuramente più lungo di 200 caratteri.

MODIFICA: Si reindirizza nuovamente al secondo URL quando si imposta un cookie! Se rivedi di nuovo la stessa pagina con un cookie esistente, visualizza solo l'URL più breve.


Ma che dire dell'URL minuscolo? Sembra che il tuo web-server è per quanto riguarda gli URL maiuscole e minuscole, e la versione minuscola:

http://www.nacolmeia.com.br/do/home/oferta/ener

... visualizza una pagina di errore generico. Non reindirizza all'URL di 247 caratteri. In modo che passa la convalida dal momento che l'unica cosa che model.URLField riguarda è; carica una pagina web o no?

+0

Solo per aggiungere un'altra nota a questo : L'attività di "reindirizzamento solo se cookie" si comporta in modo strano per 'verify_exists' perché urllib2 non include un gestore di cookie per impostazione predefinita. –

Problemi correlati