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.