urls django url url-validation

urls - ¿Cómo puedo verificar si existe una URL con los validadores de Django?



django path (7)

Consulte: 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")

Quiero verificar en django si existe una URL y si la tengo, quiero mostrar algo en la pantalla, es decir:

if URL_THAT_POINTS_TO_SOME_PDF exists SHOW_SOMETHING


Cualquier cosa basada en el parámetro verify_exists para django.core.validators.URLValidator dejará de funcionar con Django 1.5. La documentación útil no dice nada acerca de esto, pero el código fuente revela que el uso de ese mecanismo en 1.4 (la última versión estable) lleva a una DeprecationWarning (Verás que se ha eliminado completamente en la versión de desarrollo ):

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 peculiaridades con este método relacionado con el hecho de que utiliza una solicitud HEAD para verificar las URL: seguro de ancho de banda, pero algunos sitios (como Amazon) responden con un error (a HEAD , donde tendría el equivalente GET estado bien), y esto conduce a resultados falsos negativos del validador .

También recomendaría (mucho ha cambiado en dos años) recomendar no hacer nada con urllib2 en una plantilla; esto es completamente la parte incorrecta del ciclo de solicitud / respuesta para desencadenar operaciones potencialmente de larga ejecución: considere qué sucede si la URL sí lo hace. existe, pero un problema de DNS hace que urllib2 tarde 10 segundos en resolverlo. BAM! Instantáneo 10 segundos extra en tu página de carga.

Yo diría que la mejor práctica actual para realizar tareas de larga duración como esta asíncronas (y por lo tanto no bloquear la carga de la página) es usar django-celery ; hay un tutorial básico que cubre el uso de pycurl para revisar un sitio web, o puede ver cómo Simon Willison implementó las tareas de apio (diapositivas 32-41) para un propósito similar en Lanyrd.


No he visto la respuesta aquí. Podría ser útil para alguien más.

from django import forms f = forms.URLField() try: f.clean(http://example.com) print "valid url" except: print "invalid url"


Tomó un adicional:

desde django.core.exceptions import ValidationError

para que funcione para mi Solo diciendo; 0)


Edición: Tenga en cuenta que esto ya no es válido para ninguna versión de Django por encima de 1.5

Supongo que desea verificar si el archivo existe realmente, no si solo hay un objeto (que es solo una simple sentencia if)

Primero, recomendaré buscar siempre en el código fuente de Django porque encontrarás un excelente código que podrías usar :)

Supongo que quieres 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 ValidationError cuando no pueda abrir el enlace. Utiliza urllib2 para abrir la solicitud, por lo que no solo usa la comprobación básica de expresiones regulares (sino que también lo hace).

Puede introducir esto en una etiqueta de plantilla personalizada, que descubrirá cómo crear en los documentos de django y listo.

Espero que sea un comienzo para ti.


Problema

from django.core.validators import URLValidator dice que www.google.ro no es válido. Lo que está mal en mi punto de vista. O al menos no lo suficiente.

¿Cómo resolverlo?

La pista es mirar el código fuente de models.URLField , verás que usa forms.FormField como validador. Lo que hace más que URLValidator desde arriba

Solución

Si quiero validar una url como http://www.google.com o me gusta www.google.ro , haría lo siguiente:

desde django.forms importar URLField

def validate_url(url): url_form_field = URLField() try: url = url_form_field.clean(url) except ValidationError: return False return True

Encontré esto útil. Tal vez ayuda a alguien más.


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 está precedida por un esquema como http:// . Me pregunto si eso es por diseño.