Solo me pregunto si hay alguna forma de que pueda verificar si la URL se vincula a una imagen válida o no en Django.Django: compruebe si existe una imagen en alguna url particular
Respuesta
Aquí hay un método a prueba de fallas. Primero, analiza la URL para obtener el dominio y el resto.
>>> from urllib.parse import urlparse
>>> url = 'http://example.com/random/folder/path.html'
>>> parse_object = urlparse(url)
>>> parse_object.netloc
'example.com'
>>> parse_object.path
'/random/folder/path.html'
>>> parse_object.scheme
'http'
Ahora, utilice la información anterior para obtener el tipo de contenido. Use el parse_object.netloc
en lugar de sstatic.net y el parse_object.path
en lugar de la ruta codificada.
>>> import httplib
>>> conn = httplib.HTTPConnection("sstatic.net")
>>> conn.request("HEAD", "/stackoverflow/img/favicon.ico")
>>> res = conn.getresponse()
>>> print res.getheaders()
[('content-length', '1150'), ('x-powered-by', 'ASP.NET'), ('accept-ranges', 'bytes'), ('last-modified', 'Mon, 02 Aug 2010 06:04:04 GMT'), ('etag', '"2187d82832cb1:0"'), ('cache-control', 'max-age=604800'), ('date', 'Sun, 12 Sep 2010 13:39:26 GMT'), ('content-type', 'image/x-icon')]
Esto le indica que se trata de una imagen (image/* mime-type) de 1150 bytes. Información suficiente para que usted decida si quiere buscar el recurso completo.
EDITAR
para las direcciones URL acortadas, como http://goo.gl/IwruD
que apunta a http://ubuntu.icafebusiness.com/images/ubuntugui2.jpg
, en la respuesta que se obtiene, hay un parámetro adicional denominado 'location'
.
Aquí es lo que estoy hablando:
>>> import httplib
>>> conn = httplib.HTTPConnection("goo.gl")
>>> conn.request("HEAD", "/IwruD")
>>> res = conn.getresponse()
>>> print res.getheaders()
[('x-xss-protection', '1; mode=block'),
('x-content-type-options', 'nosniff'),
('transfer-encoding', 'chunked'),
('age', '64'),
('expires', 'Mon, 01 Jan 1990 00:00:00 GMT'),
('server', 'GSE'),
('location', 'http://ubuntu.icafebusiness.com/images/ubuntugui2.jpg'),
('pragma', 'no-cache'),
('cache-control', 'no-cache, no-store, max-age=0, must-revalidate'),
('date', 'Sat, 30 Jun 2012 08:52:15 GMT'),
('x-frame-options', 'SAMEORIGIN'),
('content-type', 'text/html; charset=UTF-8')]
Mientras que en la url directa, no lo encontraría.
>>> import httplib
>>> conn = httplib.HTTPConnection("ubuntu.icafebusiness.com")
>>> conn.request("HEAD", "/images/ubuntugui2.jpg")
>>> res = conn.getresponse()
>>> print res.getheaders()
[('content-length', '78603'), ('accept-ranges', 'bytes'), ('server', 'Apache'), ('last-modified', 'Sat, 16 Aug 2008 01:36:17 GMT'), ('etag', '"1fb8277-1330b-45489c3ad2640"'), ('date', 'Sat, 30 Jun 2012 08:55:46 GMT'), ('content-type', 'image/jpeg')]
Puede buscar que el uso de un código simple:
>>> r = res.getheaders()
>>> redirected = False
>>> for e in r:
>>> if(e[0] == 'location'):
>>> redirected = e
>>>
>>> if(redirected != False):
>>> print redirected[1]
'http://ubuntu.icafebusiness.com/images/ubuntugui2.jpg'
Mi intérprete de python dice "ImportError: ningún módulo llamado parse". Tu método falló en el paso 1. ¿Alguna idea? –
Lo encontré, estás usando python 3 mientras estoy usando python 2.7 :) –
Una duda más, supongo que 'http://ubuntu.icafebusiness.com/images/ubuntugui2.jpg' es la url y la acorté usando shortner de google url por lo que ahora se convierte en 'http://goo.gl/IwruD'.Now en esta url acortada su método no está funcionando, dice "ResponseNotReady". ¿Qué dicen? –
Una manera simple de verificar esto usando urllib2.
>>> import urllib2
>>> url = 'https://www.google.com.pk/images/srpr/logo3w.png'
>>> try:
... f = urllib2.urlopen(urllib2.Request(url))
... imageFound = True
... except:
... imageFound = False
...
>>> imageFound
True
Usando requests y PIL para verificar que en realidad es una imagen válida:
>>> import requests
>>> from PIL import Image
>>> from StringIO import StringIO
>>> r = requests.get('http://cdn.sstatic.net/stackoverflow/img/sprites.png')
>>> im = Image.open(StringIO(r.content))
>>> im
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=238x1073 at 0x2845EA8>
¿Qué pasaría si la imagen no estuviera allí? ¿su código se bloqueará o tendría que verificar algunos atributos de im? ¿Puedes actualizar tu código a una función devolviendo un booleano? – Radu
'r.status_code' no sería 200 – jterrace
Sí, aparte del código de estado HTTP, Image.open debería arrojar algún tipo de error, estoy pensando? PIL no es muy útil en esto ... También estaba viendo http://effbot.org/imagingbook/image.htm#tag-Image.Image.verify pero no puedo entender qué usar. – Radu
- 1. jQuery: compruebe si existe imagen
- 2. python: compruebe si existe url a jpg
- 3. Compruebe si existe tabla
- 4. compruebe si una cadena es una URL
- 5. ¿Cómo comprobar si existe una imagen con una URL determinada?
- 6. Compruebe si existe una inclusión (o requiere)
- 7. Compruebe si existe un servicio en una máquina en particular sin usar el manejo de excepciones
- 8. BASH - Compruebe si existe PID
- 9. Django: compruebe si ya existe un objeto antes de agregar
- 10. Compruebe si existe una tabla SQL
- 11. Compruebe si existe una entrada de formulario
- 12. Compruebe si una URL tiene http: // prefijo
- 13. Compruebe si existe evento en el elemento
- 14. Compruebe si existe un directorio en PHP
- 15. Vb.Net Compruebe si la imagen existente en otra imagen
- 16. Postgresql: compruebe si existe el esquema
- 17. Compruebe si existe un servicio web
- 18. Compruebe si existe un objeto en VBScript
- 19. Compruebe si existe un valor en ArrayList
- 20. Compruebe si existe un nodo en h5py
- 21. Comprobar si existe una URL en Ruby
- 22. Compruebe si el valor existe en dataTable?
- 23. compruebe si el archivo existe en php
- 24. Compruebe si el archivo existe en ksh
- 25. javascript: compruebe si existe una matriz; si no, créela
- 26. jquery compruebe si la pestaña con un título en particular ya existe
- 27. Cakephp: compruebe si existe elemento de vista
- 28. Rieles I18n, compruebe si existe traducción?
- 29. Django: agregar la imagen en una imagen de ImageField url
- 30. ¿Puedo verificar si existe un archivo en una URL?
Si la imagen está en el mismo máquina como Django, entonces simplemente puede leer el archivo y validarlo. De lo contrario, debe realizar una llamada REST y analizar el resultado. – freakish
La imagen no existe en la misma máquina que Django. De hecho, tengo un formulario donde el usuario debe enviar una url de alguna imagen. Solo quiero verificar si esa URL se vincula a una imagen real o no. –
Lea esto: http://stackoverflow.com/questions/7699796/how-do-you-get-django-to-make-a-restful-call (posible duplicado). – freakish