2012-06-29 14 views
5

पर कोई छवि मौजूद है या नहीं, बस सोच रहा है कि मैं यह जांच सकता हूं कि यूआरएल वैध छवि के लिंक यूजेएल में है या नहीं।Django: जांचें कि कोई विशेष यूआरएल

+1

यदि छवि एक ही पर है मशीन Django के रूप में, तो आप बस फ़ाइल को पढ़ सकते हैं और इसे मान्य कर सकते हैं। यदि नहीं, तो आपको एक आरईएसटी कॉल करना होगा और परिणाम का विश्लेषण करना होगा। – freakish

+0

छवि Django के समान मशीन पर मौजूद नहीं है। असल में मेरे पास एक ऐसा फॉर्म है जहां उपयोगकर्ता को कुछ छवि का यूआरएल जमा करने की आवश्यकता होती है। मैं सिर्फ यह जांचना चाहता हूं कि वह यूआरएल किसी भी वास्तविक छवि से लिंक है या नहीं। –

+0

इसे पढ़ें: http://stackoverflow.com/questions/7699796/how-do-you-get-django-to-make-a-restful-call (संभावित डुप्लिकेट)। – freakish

उत्तर

3

यहां एक असफल तरीका है। सबसे पहले, डोमेन और बाकी को पाने के लिए यूआरएल पार्स करें।

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

अब, सामग्री प्रकार प्राप्त करने के लिए उपर्युक्त जानकारी का उपयोग करें। Sstatic.net के बजाय parse_object.netloc और हार्डकोडेड पथ के बजाय parse_object.path का उपयोग करें।

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

यह आपको बताता है कि यह 1150 बाइट्स की एक छवि (छवि/* माइम-प्रकार) है। यह तय करने के लिए पर्याप्त जानकारी है कि क्या आप पूर्ण संसाधन प्राप्त करना चाहते हैं।

संपादित

छोटा यूआरएल के लिए, http://goo.gl/IwruD जो http://ubuntu.icafebusiness.com/images/ubuntugui2.jpg को इंगित करता है, प्रतिक्रिया है कि आप प्राप्त की तरह, वहाँ एक अतिरिक्त पैरामीटर 'location' कहा जाता है।

यहाँ मैं किस बारे में बात कर रहा हूँ है:

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

प्रत्यक्ष यूआरएल में रहते हुए, आप यह नहीं मिल जाएगा।

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

आपको लगता है कि का उपयोग कर एक सरल कोड के लिए देख सकते हैं:

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

मेरा पायथन दुभाषिया कहता है "आयात त्रुटि: कोई मॉड्यूल पार्स नाम नहीं है"। आपकी विधि चरण 1 में विफल रही। कोई विचार? –

+0

पाया गया, आप अभी भी पायथन 3 का उपयोग कर रहे हैं, जबकि मैं अभी भी अजगर का उपयोग कर रहा हूं 2.7 :) –

+0

एक और संदेह है, मान लीजिए कि 'http://ubuntu.icafebusiness.com/images/ubuntugui2.jpg' यूआरएल है और मैंने इसे छोटा कर दिया google url शॉर्टनर तो अब यह 'http://goo.gl/IwruD' बन गया है.अब इस संक्षिप्त यूआरएल पर आपकी विधि काम नहीं कर रही है, यह कहती है "ResponseNotReady"। क्या कहना है? –

3

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

सत्यापित करने के लिए कि यह वास्तव में एक वैध छवि है requests और PIL का उपयोग करना:

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

यदि छवि वहां नहीं थी तो क्या होगा? क्या आपका कोड दुर्घटनाग्रस्त होगा या आपको आईएम के कुछ विशेषताओं की जांच करनी होगी? क्या आप एक बूलियन लौटने वाले फ़ंक्शन में अपना कोड अपडेट कर सकते हैं? – Radu

+0

'r.status_code' 200 – jterrace

+0

नहीं होगा हाँ हाँ एचटीटीपी स्टेटस कोड के अलावा, Image.open को किसी प्रकार की त्रुटि फेंकनी चाहिए जो मैं सोच रहा हूं? पीआईएल इस में बहुत मददगार नहीं है ... मैं http://effbot.org/imagingbook/image.htm#tag-Image.Image.verify पर भी देख रहा था लेकिन इसका उपयोग नहीं कर सकता कि इसका क्या उपयोग करना है। – Radu

संबंधित मुद्दे