2011-09-04 11 views
25

मैं Django का उपयोग करके एक्सेस नियंत्रण के साथ फ़ाइल डाउनलोड के संबंध में कुछ शोध कर रहा हूं। मेरा लक्ष्य किसी फ़ाइल को एक्सेस को पूरी तरह अवरुद्ध करना है, सिवाय इसके कि जब किसी विशिष्ट उपयोगकर्ता द्वारा एक्सेस किया जाता है। मैंने पढ़ा है कि Django का उपयोग करते समय, एक्स-सेंडफाइल इसे प्राप्त करने के लिए पसंद के तरीकों में से एक है (अन्य SO प्रश्नों आदि के आधार पर)। Django के साथ एक्स Sendfile का उपयोग करने का मेरे अल्पविकसित समझ है:Django - X-Sendfile को समझना

  1. उपयोगकर्ता अनुरोधों यूआरआई एक संरक्षित फ़ाइल
  2. Django अनुप्रयोग जो फ़ाइल URL के आधार पर वापसी करने का फैसला करता प्राप्त करने के लिए, और चेक उपयोगकर्ता की अनुमति, आदि
  3. Django ऐप 'एक्स-सेंडफाइल' हेडर के साथ एक HTTP प्रतिक्रिया देता है जो सर्वर के फ़ाइल पथ
  4. पर वेब सर्वर फ़ाइल पाता है और इसे अनुरोधकर्ता को देता है (मुझे लगता है कि वेब सर्वर भी 'एक्स-सेंडफाइल' रास्ते में शीर्षलेख)

सीधे Django से फ़ाइल को चकित करने की तुलना में, एक्स-सेंडफ़ाइल संरक्षित डाउनलोड प्राप्त करने की एक और अधिक प्रभावी विधि होने की संभावना है (क्योंकि मैं फ़ाइलों को सेवा देने के लिए Nginx पर भरोसा कर सकता हूं, लेकिन Django बनाम), लेकिन मेरे लिए 2 प्रश्न छोड़ देता है:

  1. क्या एक्स-सेंडफाइल का मेरा स्पष्टीकरण कम से कम संक्षेप में सही है?
  2. क्या यह वास्तव में सुरक्षित है, मानते हैं कि मैं सामान्य, फ्रंट-एंड HTTP पहुंच (उदा। http://www.example.com/downloads/secret-file.jpg) फ़ाइल को संग्रहीत निर्देशिका में प्रदान नहीं करता (यानी, इसे मेरे public_html निर्देशिका में न रखें)? या, एक तकनीक-समझदार उपयोगकर्ता हेडर आदि की जांच कर सकता है और एक फ़ाइल तक पहुंचने के लिए रिवर्स इंजीनियर को एक तरीका (फिर वितरित करने के लिए)?
  3. क्या यह वास्तव में प्रदर्शन में एक बड़ा अंतर है। क्या मैं सीधे डीजेगो से 150 एमबी फाइलों के 8 बी खंडित डाउनलोड प्रदान करके अपने आवेदन सर्वर को नीचे घुमाने जा रहा हूं, या यह एक गैर-मुद्दा है? कारण मैं पूछता हूं क्योंकि यदि दोनों संस्करण बराबर हैं, तो Django संस्करण पाइथन में चीजों को करने की मेरी क्षमता के कारण बेहतर होगा, जैसे पूर्ण डाउनलोड की संख्या लॉग, डाउनलोड की टैली बैंडविड्थ आदि।

धन्यवाद अग्रिम रूप से।

+0

आपके द्वारा ऊपर उल्लिखित चरणों में, एक बात मुझे स्पष्ट नहीं है: जब आपने कहा था कि 'Django ऐप एक्स-सेंडफाइल हेडर सेट के साथ HTTP प्रतिक्रिया देता है', तो उस प्रतिक्रिया प्राप्तकर्ता कौन है? मुझे लगता है कि यह वेब सर्वर होगा (उदा। Nginx)। यदि ऐसा है, तो जिसने Django ऐप द्वारा पहली बार संभाला गया अनुरोध शुरू किया? – MLister

+0

@MLister - उपयोगकर्ता (वेब ​​ब्राउज़र) - मूल रूप से, आप 'get_file (request, file_name)' (उस प्रभाव से कुछ) जैसे दृश्य को सेट करना चाहते हैं और जब कोई उपयोगकर्ता URL पर जाता है, तो ' X-Sendfile 'नामित फ़ाइल के लिए सही स्थान पर इंगित करता है (यह देखने के लिए कि आप उपयोगकर्ता को फ़ाइल डाउनलोड करने की अनुमति दी जानी चाहिए या नहीं, यह देखने के लिए जो भी तर्क आप चाहते हैं उसे जोड़ने के बाद)।Nginx इसके रास्ते पर प्रतिक्रिया को रोक देगा और फ़ाइल के साथ प्रतिक्रिया (एक डाउनलोड के रूप में) वापस कर देगा। – orokusaki

+0

तो 'nginx' को * Django' ऐप सर्वर के सामने * स्थापित किया जाना चाहिए? अन्यथा, 'nginx' इसके रास्ते पर प्रतिक्रिया को कैसे रोक सकता है? – MLister

उत्तर

19
  1. हां, यह ठीक है कि यह कैसे काम करता है।
  2. सटीक कार्यान्वयन वेबसर्वर पर निर्भर करता है लेकिन nginx के मामले में, बाहरी पहुंच को रोकने के लिए स्थान को आंतरिक के रूप में चिह्नित करने की अनुशंसा की जाती है।
  3. एनजिनक्स असीमित रूप से फाइलों की सेवा कर सकता है जबकि Django के साथ आपको प्रति अनुरोध एक थ्रेड की आवश्यकता होती है जो समानांतर अनुरोधों की उच्च संख्या के लिए समस्याग्रस्त हो सकती है।

एक्स-सेंडफाइल के बजाय nginx के लिए एक्स-एक्सेल-रीडायरेक्ट हेडर भेजने के लिए याद रखें। अधिक जानकारी के लिए http://wiki.nginx.org/XSendfile देखें।