2010-07-03 9 views

Respuesta

45

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.

+19

'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

+0

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 –

+0

[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

2

Se tomó un adicional:

de django.core.exceptions importar ValidationError

para que funcione para mí. Simplemente decir; 0)

1
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.

4

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.

0

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" 
+0

Iba a poner un asnwer similar. Tuviste un buen intento, pero no es suficiente. –

1

Problema

from django.core.validators import URLValidatorwww.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.

0

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") 
Cuestiones relacionadas