2012-06-29 20 views
5

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

+1

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

+0

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

+0

Lea esto: http://stackoverflow.com/questions/7699796/how-do-you-get-django-to-make-a-restful-call (posible duplicado). – freakish

Respuesta

3

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

Mi intérprete de python dice "ImportError: ningún módulo llamado parse". Tu método falló en el paso 1. ¿Alguna idea? –

+0

Lo encontré, estás usando python 3 mientras estoy usando python 2.7 :) –

+0

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? –

3

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 
4

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

¿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

+0

'r.status_code' no sería 200 – jterrace

+0

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

Cuestiones relacionadas