2011-04-08 13 views
6

¿Podría alguien aclararme por qué esta url http://www.nacolmeia.com.br/do/Home/oferta/EnER no se acepta en un formulario generado a partir de Django de URLField?Problema con la prueba de campo URL de Django

:)

Gracias

+0

No relacionado con este caso específico, pero he encontrado que django considera que las URL son inválidas si rechazan una solicitud HEAD. Por ejemplo, cualquier contenido alojado por wix.com (www.wehaveavoice.org.uk). – Julian

Respuesta

7

¿Estás aloja el sitio desde el mismo servidor que está intentando validarlo en? 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.

No se ve como su validación en su defecto a nivel del formulario

>>> 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.'] 
>>> 

Si no es necesario para validar que el sitio web no devuelve un 404, en sus modelos. py

url = models.URLField(verify_exists=False) 

edición:

después de buscar en el código fuente de django here y algunos problemas con el shell, todavía no estoy seguro de por qué el URL con mayúsculas está causando un bucle de redirección.

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

se planteó la excepción real es 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 
>>> 

Aquí hay algunos anuncios que hablan de la HTTPError: here y here

parece que tiene algo que ver con las cookies, pero No puedo ofrecer una buena explicación, se lo dejo a alguien más.

Una solución alternativa que podría funcionar si no desea desactivar la validación, pero no le importa el uso de mayúsculas de sus URL, es anular el método clean_field de sus formularios.

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

Pruebas adicionales demostraron que el problema eran los caracteres mayúsculas ... ¿Debería ser así? – Rodrogo

+0

¿qué quieres decir? funciona si minúsculas todas las letras? – DTing

+0

Sí. (lo siento, usuario de segundo idioma inglés). Cuando la URL se puso en minúscula, el formulario lo aceptó. – Rodrogo

0

Creo que he encontrado el problema. Al abrir esta URL:

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

... se redirige a esta 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.

La primera URL está bien, pero la redirigida tiene 247 caracteres. Este "no debería" ser un problema, excepto que models.fields.URLField tiene max_length que tiene como valor predeterminado caracteres. Por lo tanto, falla la validación porque es demasiado larga.

En su lugar, aumente el max_length y debería funcionar: models.URLField(max_length=255) Para obtener información sobre la URL más larga posible, see this SO question. Sin embargo, definitivamente tiene más de 200 caracteres.

EDIT: ¡Solo redirige a la segunda URL al establecer una cookie! Si vuelves a visitar la misma página con una cookie existente, solo muestra la URL más corta.


¿Pero y la URL en minúsculas? Al parecer, su servidor web entre mayúsculas y minúsculas en relación con las direcciones URL, y la versión en minúsculas:

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

... muestra una página de error genérico. No redirige a la URL de 247 caracteres. Entonces eso pasa la validación ya que lo único que le importa a los modelos.URLField es; ¿Carga una página web o no?

+0

Solo para agregar otra nota a este : El negocio de "redirigir solo si se hace una cookie" se comporta de forma extraña para 'verify_exists' porque urllib2 no incluye un manejador de cookies de manera predeterminada. –

Cuestiones relacionadas