¿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
¿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
¿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()
Pruebas adicionales demostraron que el problema eran los caracteres mayúsculas ... ¿Debería ser así? – Rodrogo
¿qué quieres decir? funciona si minúsculas todas las letras? – DTing
Sí. (lo siento, usuario de segundo idioma inglés). Cuando la URL se puso en minúscula, el formulario lo aceptó. – Rodrogo
Creo que he encontrado el problema. Al abrir esta URL:
http://www.nacolmeia.com.br/do/Home/oferta/EnER
... se redirige a esta URL:
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?
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. –
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