2012-06-29 18 views
5

Chỉ cần tự hỏi có cách nào tôi có thể kiểm tra xem các liên kết url đến một hình ảnh hợp lệ hay không ở Django.Django: kiểm tra xem một hình ảnh có tồn tại ở một số url cụ thể không?

+1

Nếu hình ảnh là trên cùng một máy như Django, sau đó bạn chỉ có thể đọc các tập tin và xác nhận nó. Nếu không, thì bạn phải thực hiện cuộc gọi REST và phân tích cú pháp kết quả. – freakish

+0

Hình ảnh không tồn tại trên cùng một máy như Django.Tôi thực sự có một hình thức mà người dùng cần gửi một url của một số image.I chỉ muốn kiểm tra xem url đó có liên kết đến bất kỳ hình ảnh thực tế nào hay không. –

+0

Đọc phần này: http://stackoverflow.com/questions/7699796/how-do-you-get-django-to-make-a-restful-call (có thể trùng lặp). – freakish

Trả lời

3

Đây là phương pháp không an toàn. Đầu tiên, phân tích cú pháp url để nhận miền và phần còn lại.

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

Bây giờ, hãy sử dụng thông tin trên để nhận loại nội dung. Sử dụng parse_object.netloc thay vì sstatic.net và parse_object.path thay vì đường dẫn được mã cứng.

>>> 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')] 

Điều này cho bạn biết đó là hình ảnh (image/* mime-type) là 1150 byte. Đủ thông tin để bạn quyết định xem bạn có muốn tìm nạp toàn bộ tài nguyên hay không.

EDIT

Đối với các url rút ngắn, như http://goo.gl/IwruD mà điểm đến http://ubuntu.icafebusiness.com/images/ubuntugui2.jpg, trong phản ứng mà bạn nhận được, có một tham số bổ sung được gọi 'location'.

Đây là những gì tôi đang nói về:

>>> 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')] 

Trong khi trong url trực tiếp, bạn sẽ không tìm thấy nó.

>>> 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')] 

Bạn có thể tìm kiếm rằng việc sử dụng một mã đơn giản:

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

Trình thông dịch viên python của tôi có nội dung "ImportError: Không có module nào được phân tích cú pháp". Phương pháp của bạn không thành công ở Bước 1.Bất cứ ý tưởng nào? –

+0

Tìm thấy nó, Bạn đang sử dụng python 3 trong khi tôi vẫn đang sử dụng python 2.7 :) –

+0

Một nghi ngờ nữa, giả sử 'http://ubuntu.icafebusiness.com/images/ubuntugui2.jpg' là url và tôi rút ngắn nó bằng cách sử dụng google url shortner để nó bây giờ trở thành 'http://goo.gl/IwruD'.Now trên url này rút ngắn phương pháp của bạn không hoạt động, nó nói "ResponseNotReady". Nói gì? –

3

Cách đơn giản để kiểm tra điều này bằng cách sử dụng 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

Sử dụng requestsPIL để xác minh rằng nó thực sự là một hình ảnh hợp lệ:

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

Điều gì sẽ xảy ra nếu hình ảnh không có ở đó? sẽ mã của bạn sụp đổ hoặc bạn sẽ phải kiểm tra một số thuộc tính của im? Bạn có thể cập nhật mã của bạn thành một hàm trả về boolean không? – Radu

+0

'r.status_code' sẽ không là 200 – jterrace

+0

Có ngoài mã trạng thái HTTP, Image.open nên ném một số loại lỗi mà tôi đang suy nghĩ? PIL không phải là rất hữu ích trong việc này ... Tôi cũng nhìn vào http://effbot.org/imagingbook/image.htm#tag-Image.Image.verify nhưng không thể tìm ra những gì để sử dụng. – Radu

Các vấn đề liên quan