Quiero comprobar en Django si existe una dirección URL y si lo hace quiero mostrar algo en la pantalla, es decir:¿Cómo puedo verificar si existe una URL con los validadores de Django?
if URL_THAT_POINTS_TO_SOME_PDF exists
SHOW_SOMETHING
Quiero comprobar en Django si existe una dirección URL y si lo hace quiero mostrar algo en la pantalla, es decir:¿Cómo puedo verificar si existe una URL con los validadores de Django?
if URL_THAT_POINTS_TO_SOME_PDF exists
SHOW_SOMETHING
Editar: Atención, esto ya no es válida para cualquier versión de Django anteriormente 1.5
me supuesto de que desea comprobar si realmente existe el archivo, no si sólo hay un objeto (que es sólo un simple if)
en primer lugar, voy a recomendar siempre mirando a través de código fuente de Django, porque usted find some great code que podría use :)
Supongo que quiere hacer esto dentro de una plantilla. No hay una etiqueta de plantilla incorporada para validar una URL, pero esencialmente podría usar esa clase URLValidator
dentro de una etiqueta de plantilla para probarla. Simplemente:
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError
validate = URLValidator(verify_exists=True)
try:
validate('http://www.somelink.com/to/my.pdf')
except ValidationError, e:
print e
La clase URLValidator
será escupir el ValidationError
cuando no se puede abrir el enlace. Utiliza urllib2
para abrir realmente la solicitud por lo que no solo está usando la comprobación de expresiones regulares (también lo hace).
Puede insertar esto en una etiqueta de plantilla personalizada, que encontrará cómo crear en django documentos y listo.
Espero que sea un comienzo para ti.
Se tomó un adicional:
de django.core.exceptions importar ValidationError
para que funcione para mí. Simplemente decir; 0)
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError
validate = URLValidator(verify_exists=True)
value = request.GET.get('url', None)
if value:
try:
validate(value)
except ValidationError, e:
print e
validate(value)
falla si la URL no es precedida con un esquema como http://
. Me pregunto si eso es por diseño.
Cualquier cosa basado en el parámetro verify_exists
a django.core.validators.URLValidator
dejará de funcionar con Django 1.5 - the documentation amablemente dice nada acerca de esto, pero la source code revela que el uso de ese mecanismo en 1.4 (la última versión estable) conduce a una DeprecationWarning
(usted ver it has been removed completely in the development version):
if self.verify_exists:
import warnings
warnings.warn(
"The URLField verify_exists argument has intractable security "
"and performance issues. Accordingly, it has been deprecated.",
DeprecationWarning
)
también hay algunas rarezas con este método relacionado con el hecho de que utiliza una solicitud HEAD
para comprobar las direcciones URL - ancho de banda eficaz, seguro, pero algunos sitios (como Amazon) responden con una error (a HEAD
, donde el equ ivalent GET
habría estado bien), y esto lleva a false negative results from the validator.
También (muchas cosas ha cambiado en dos años) recomiendo no hacer nada con urllib2
en una plantilla: esta es la parte completamente incorrecta del ciclo de solicitud/respuesta para desencadenar operaciones potencialmente de larga duración: considere qué sucede si la URL existe, pero un problema de DNS hace que urllib2
tome 10 segundos para solucionarlo. BAM! Instantáneo 10 segundos extra en la carga de tu página.
Diría que la mejor práctica actual para realizar tareas de larga ejecución como esta asíncrona (y por lo tanto no bloquear la carga de la página) es usar django-celery
; hay a basic tutorial que cubre el uso de pycurl
para consultar un sitio web, o puede consultar how Simon Willison implemented celery tasks (diapositivas 32-41) para fines similares en Lanyrd.
No he visto la respuesta aquí. Puede ser útil para otra persona.
from django import forms
f = forms.URLField()
try:
f.clean(http://example.com)
print "valid url"
except:
print "invalid url"
Iba a poner un asnwer similar. Tuviste un buen intento, pero no es suficiente. –
Problema
from django.core.validators import URLValidator
www.google.ro
dice que no es válido. Lo cual está mal en mi punto de vista. O al menos no lo suficiente.
¿Cómo resolverlo?
La clave Es ver el código fuente de models.URLField
, verá que usa forms.FormField
como validador. Lo cual hace más que URLValidator
desde arriba
Solución
Si quiero validar un url
como http://www.google.com
o como www.google.ro
, yo haría lo siguiente:
de django.forms importar campo URLy
def validate_url(url):
url_form_field = URLField()
try:
url = url_form_field.clean(url)
except ValidationError:
return False
return True
Encontré esto útil. Quizás ayuda a alguien más.
Ver: http://www.agmweb.ca/2009-04-19-django-urlpatterns---its-more-than-just-urls/
En Django 1.10 Ahora uso:
from django.core.urlresolvers import RegexURLResolver, Resolver404
if 'next' in request.GET.keys():
n = request.GET["next"].strip('/') + "/"
resolver = RegexURLResolver(r'', urls)
try:
callback, callback_args, callback_kwargs = resolver.resolve(n)
return HttpResponseRedirect(str(request.GET["next"]))
except Resolver404:
raise PermissionDenied("This page is not available")
'verify_exists' está [obsoleta para la seguridad] (https://docs.djangoproject.com/en/1.4/ref /models/fields/#django.db.models.URLField.verify_exists) razones y se ha eliminado en Django 1.5 – Yohann
debido a que el argumento django 1.5, verify_exists ha quedado en desuso/eliminado, ya no se puede verificar la existencia de una url, ahora es solo una simple coincidencia de expresiones regulares para una url válida –
[enlace de advertencia privada en el archivo de internet] (https://web.archive.org/ web/20150907152504/https: //docs.djangoproject.com/en/1.4/ref/models/fields/#django.db.models.URLField.verify_exists) – luckydonald