2010-04-21 16 views
6

तो मैं /home/username/music में किसी फ़ोल्डर से कुछ एमपी 3 की सेवा करना चाहता हूं। मुझे नहीं लगता था कि यह इतना बड़ा सौदा होगा, लेकिन मैं सामान्य विचारों और अपने स्वयं के यूआरएल का उपयोग करके इसे कैसे करना है इस पर थोड़ा उलझन में हूं।Django: जेनेरिक व्यू में एक डाउनलोड की सेवा

urls.py

url(r'^song/(?P<song_id>\d+)/download/$', song_download, name='song_download'), 

उदाहरण मैं अनुसरण कर रहा हूं Django दस्तावेजों की सामान्य दृश्य अनुभाग में पाया जाता है: http://docs.djangoproject.com/en/dev/topics/generic-views/

(यह निचले भाग में सभी तरह से है) मैं 100 नहीं कर रहा हूँ % मेरी ज़रूरतों को पूरा करने के बारे में सुनिश्चित करें। यहाँ मेरी views.py

def song_download(request, song_id): 
    song = Song.objects.get(id=song_id) 

    response = object_detail(
     request, 
     object_id = song_id, 
     mimetype = "audio/mpeg", 
    ) 
    response['Content-Disposition'= "attachment; filename=%s - %s.mp3" % (song.artist, song.title) 

    return response 

है मैं वास्तव में कैसे व्यक्त करने के लिए कि मैं इसे बजाय क्या यह अब जो उत्पादन के लिए वर्तमान के सभी के साथ एक .mp3 है करता है की मेरी एमपी 3 थूक से बाहर करना चाहते हैं की एक नुकसान में हूँ पेज एचटीएमएल निहित है। क्या मेरा टेम्पलेट मेरा एमपी 3 होना चाहिए? क्या मुझे फ़ाइलों की सेवा के लिए अपाचे सेट अप करने की आवश्यकता है या Django फाइल सिस्टम से एमपी 3 को पुनः प्राप्त करने में सक्षम है (कोर्स की उचित अनुमतियां) और उसकी सेवा करते हैं? अगर इसे अपाचे को कॉन्फ़िगर करने की आवश्यकता है तो मैं Django को कैसे बताऊं?

अग्रिम धन्यवाद। ये फ़ाइलें सभी एचडी पर हैं इसलिए मुझे स्पॉट पर कुछ भी "उत्पन्न" करने की आवश्यकता नहीं है और यदि संभव हो तो मैं इन फ़ाइलों के स्थान को प्रकट करना बंद करना चाहता हूं। एक सरल/गीत/1234/डाउनलोड शानदार होगा।

उत्तर

15

आप इसे सामान्य दृश्य के साथ क्यों करना चाहते हैं? यह सामान्य विचारों के बिना यह करने के लिए बहुत आसान है:

def song_download(request, song_id): 
    song = Song.objects.get(id=song_id) 
    fsock = open('/path/to/file.mp3', 'r') 
    response = HttpResponse(fsock, mimetype='audio/mpeg') 
    response['Content-Disposition'] = "attachment; filename=%s - %s.mp3" % \ 
            (song.artist, song.title) 
    return response 

मुझे यकीन है कि अगर यह एक सामान्य दृश्य के साथ किसी भी तरह इस काम करने के लिए संभव है नहीं कर रहा हूँ। लेकिन किसी भी तरह से, एक का उपयोग कर अनावश्यक है। प्रस्तुत करने के लिए कोई टेम्पलेट नहीं के साथ, जेनेरिक व्यू द्वारा स्वचालित रूप से प्रदान किया गया संदर्भ बेकार है।

+0

अच्छी तरह से, मुझे लगता है कि मैं इसे सामान्य दृश्य के साथ काम करने के लिए ठीक कर रहा हूं, मुझे नहीं लगता था कि मुझे एक की आवश्यकता क्यों है। वास्तव में मुझे क्या चाहिए, धन्यवाद! – TheLizardKing

+0

एमपी 3 बाइनरी फाइलें है, इसलिए 'आर' – iMath

+0

के बजाय फ़ाइल रीड मोड 'आरबी' का उपयोग करके मैंने इसके लिए सब कुछ देखा! इसके लिए धन्यवाद! – adbarads

2

Django के साथ स्थिर फ़ाइलों सेवित एक बुरा विचार अपाचे है, का उपयोग करें, nginx आदि

http://docs.djangoproject.com/en/1.1/howto/static-files/

+0

मैंने सुना है, मैं अपाचे का उपयोग करने के लिए सब कुछ हूं लेकिन अपाचे का उपयोग करके मैं अपने वेब सर्वर के रूप में स्वीकृत उत्तर कैसे प्राप्त कर सकता हूं? मैं अपने यूआरएल का उपयोग करना चाहता हूं और अपना डाउनलोड यूआरएल प्रकट नहीं करना चाहता हूं। – TheLizardKing

+0

मैं एक स्थैतिक-फ़ाइल-सेवारत-विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि आप स्थिर मीडिया यूआरएल को भी लिख सकते हैं –

+0

उपरोक्त लिंक के साथ मेरी विवाद इस तरह की है कि "हम एक अलग वेब सर्वर का उपयोग करने की सलाह देते हैं - यानी, वह नहीं मीडिया की सेवा के लिए भी Django चला रहा है। यहां कुछ अच्छे विकल्प दिए गए हैं: "मैं उन्हें ज़ोरदार और स्पष्ट सुनता हूं लेकिन मान लें कि मेरे पास फ़ाइल के लिए एक पूर्ण पथ और/या यूआरएल है, मैं अपने उपर्युक्त यूआरएल का उपयोग करके इसे कैसे थूक सकता हूं स्टाइल? मैं यह देखने के लिए ओपन सोर्स django परियोजनाओं को खोजने की कोशिश कर रहा हूं कि वे इसे कैसे करते हैं। – TheLizardKing

5

कोई वास्तविक जवाब में टोमाज़ ज़िलिंस्की को मेरी टिप्पणी लपेटो करने के लिए:

कई कारणों से यह है के लिए वास्तव में apache/nginx/आदि फ़ाइलों को भेजने का काम करने के लिए बेहतर है। अधिकांश सर्वरों में उस उपयोगकेस में मदद करने के लिए तंत्र होते हैं: अपाचे और लाइटटीपीडी में xsendfile है, nginx में एक्स-एक्सेल-रीडायरेक्ट है।

विचार यह है कि आप अच्छे यूआरएल, प्रमाणीकरण विधियों आदि जैसे डीजेंगो की सभी सुविधाओं का उपयोग कर सकते हैं, लेकिन सर्वर को फाइलों की सेवा करने का काम करने दें। आपके django दृश्य को क्या करना है, एक विशेष शीर्षलेख के साथ प्रतिक्रिया वापस करना है। सर्वर फिर वास्तविक फ़ाइल के साथ प्रतिक्रिया को प्रतिस्थापित करेगा। अपाचे के लिए

उदाहरण:

def song_download(request): 
    path = '/path/to/file.mp3' 
    response = HttpResponse() 
    response['X-Sendfile'] = smart_str(path) 
    response['Content-Type'] = "audio/mpeg" 
    response['Content-Length'] = os.stat(path).st_size 
    return response 
  • mode_xsendfile
  • XSendFileOn on जोड़ने इंस्टॉल करें और अपने अपाचे विन्यास के लिए (संस्करण के आधार पर) XSendFileAllowAbove on या XSendFilePath the/path/to/serve/from

इस तरह आप फ़ाइल स्थान को प्रकट नहीं करते हैं, और dzango में सभी यूआरएल प्रबंधन को रखते हैं।

+0

आप os.stat (पथ) के बजाय os.path.getsize (pathToFile) का उपयोग कर सकते हैं .st_size – iMath

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