2010-02-19 13 views
10

मुझे विशिष्ट तर्क के अनुसार सीएसएस फ़ाइलों और जेएस फ़ाइलों को वापस करने की आवश्यकता है। जाहिर है, स्थिर सेवा जो मुझे चाहिए वह नहीं करती है। मेरे पास एक दृश्य है, जिसकी रेंडर विधि उचित फ़ाइल खोजने के लिए तर्क का उपयोग करती है, लेकिन फिर मुझे इसे वापस करना होगा। तकनीकी रूप से, मैं सिर्फ फाइल को पढ़ सकता हूं और उचित माइम प्रकार के साथ इसे HttpResponse ऑब्जेक्ट में रख सकता हूं, लेकिन मैं सोच रहा था कि क्या बेहतर रणनीति थी। (जैसे fpassthru() php में)django में एक दृश्य के माध्यम से गुजरने वाली स्थिर फाइलें कैसे वापस करें?

+1

:

# In your urls.py: url(r'^test-files/(?P<name>.+)/$', views.test_files, name='test_files'), # In your views.py: from django.http.response import HttpResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt # (Allows file download with POST requests, can be omitted) def test_files(request, name): if name == "myxml": fsock = open("/djangopath/data/static/files/my.xml", "rb") return HttpResponse(fsock) 

यह आपको से फ़ाइल डाउनलोड करने की अनुमति देता है? –

+0

दो में से कोई नहीं :) –

+0

असल में, व्याकरण प्रश्न। क्या यह "न तो" या "दोनों" है? –

उत्तर

-1

यह स्थिर सामग्री (उल्लेख करने के लिए, परिमाण धीमी गति के कई आदेश) की सेवा करने के लिए django का उपयोग करने के लिए अपमानजनक होना चाहिए।

मैं दृश्य को संदर्भ प्रोसेसर में परिवर्तित करना चाहता हूं और टेम्पलेट्स में वेरिएबल्स का उपयोग करके यह पता लगाने के लिए कि कौन से ब्लॉक शामिल हैं।

+0

यही वही है जो मैं दूर जाना चाहता हूं। मैं पहले से ही सामान समेत हूं, जिसके परिणामस्वरूप सीएसएस और जेएस फ़ाइलों को एचटीएमएल फाइल में हार्डकोड किया गया है, कैशिंग के किसी भी रूप को रोकना (क्योंकि पूरे पृष्ठ को बदलने के लिए समझा जाता है)। मैं जेएस और सीएसएस को शिप करने में सक्षम होना चाहता हूं, लेकिन चूंकि यह शिपमेंट मेरे आवेदन के प्लगइन पर निर्भर है, इसलिए मुझे फ़ाइल भेजने से पहले कुछ तर्क करने की ज़रूरत है। –

+0

क्या आप Django कैशिंग के किसी भी रूप को रोकने का मतलब है? चूंकि सीएसएस और जेएस में टेम्पलेट में हार्ड-कोडित होने से उपयोगकर्ता के ब्राउज़र को कैशिंग करने से नहीं रोका जाएगा। मैं स्पष्ट नहीं हूं कि वास्तविक समस्या क्या है। ऐसा लगता है कि गतिशील होने के कारण आपको पूरे पृष्ठ को कैशिंग करने में परेशानी हो रही है। शेष पृष्ठ कैश क्यों नहीं करें और ब्राउज़र/अपने वेब सर्वर को बाकी करने दें (वैसे भी इसका काम क्या है)? – Tom

+0

यह वास्तविक उत्तर के बाद एक महान टिप्पणी या चेतावनी देगा। –

1

कन्स्ट्रक्टर के लिए एक पुनरावर्तक (जैसे open() का परिणाम) पास करें।

1

सही स्थिर फ़ाइल के स्थान पर HttpResponseRedirect वापस क्यों न करें?

+2

क्योंकि फ़ाइल सीधे पहुंच योग्य नहीं है। –

8

आप किस वेबसर्वर सॉफ्टवेयर का उपयोग कर रहे हैं?

कम से कम अपाचे और एनजिनएक्स के लिए, एक मॉड्यूल है जो आपको X-SendFile HTTP शीर्षलेख का उपयोग करने में सक्षम बनाता है। NginX वेबसाइट का कहना है कि लाइट भी ऐसा कर सकता है।

अपने आवरण ध्यान में रखते हुए:

... 

abspath = '/most_secret_directory_on_the_whole_filesystem/protected_filename.css' 

response = HttpResponse() 
response['X-Sendfile'] = abspath 

response['Content-Type'] = 'mimetype/submimetype' 
# or let your webserver auto-inject such a header field 
# after auto-recognition of mimetype based on filename extension 

response['Content-Length'] = <filesize> 
# can probably be left out if you don't want to hassle with getting it off disk. 
# oh, and: 
# if the file is stored via a models.FileField, you just need myfilefield.size 

response['Content-Disposition'] = 'attachment; filename=%s.css' \ 
    % 'whatever_public_filename_you_need_it_to_be' 

return response 

तो फिर तुम http://mysite.com/url_path/to/serve_hidden_css_file/ के माध्यम से दृश्य जुड़ सकते हैं।

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

अपाचे के लिए: http://tn123.ath.cx/mod_xsendfile/
nginx के लिए: http://wiki.nginx.org/NginxXSendfile

16

यह मैं क्या उपयोग किया जाता है:

test_file = open('/home/poop/serve/test.pdf', 'rb') 
response = HttpResponse(content=test_file) 
response['Content-Type'] = 'application/pdf' 
response['Content-Disposition'] = 'attachment; filename="%s.pdf"' \ 
            % 'whatever' 
return response 
+0

मुझे खुले() फ़ंक्शन पर 'आरबी' मोड की आवश्यकता है, या इस कोड ने मेरे पीडीएफ को गड़बड़ कर दिया है। यह django/विचार/static.py में उपयोग किए गए कोड से मेल खाता है। –

+2

ऐसा लगता है कि यह पूरी फ़ाइल को स्मृति में लोड करने का कारण बनता है। यही है ना –

+0

@EmanuelePaolini: आप इसके बजाय 'HttpResponse' में एक इटरेटर पास कर सकते हैं, मैंने इसे प्रतिबिंबित करने के लिए उत्तर संशोधित किया है। – Flimm

4

आप Django आपके विचार

from django.contrib.staticfiles.views import serve 

... 
def view_function(request): 
    return serve(request, 'absolute_path_to_file_name') 
+7

[डॉक्स] (https://docs.djangoproject.com/en/1.4/ref/contrib/staticfiles/#other-helpers) कहते हैं: "चेतावनी। यह दृश्य केवल तभी काम करेगा जब DEBUG सत्य है। ऐसा इसलिए है क्योंकि यह दृश्य पूरी तरह से अक्षम और संभवतः असुरक्षित है। यह केवल स्थानीय विकास के लिए है, और इसका उत्पादन कभी भी नहीं किया जाना चाहिए। " –

1

सेवित अंदर StaticFiles क्यों उपयोग नहीं करते सीधे एक दृश्य से फ़ाइलें बहुत धीमी है। यदि आप सामान्य फ़ाइल की सेवा की तलाश में हैं तो यह प्रश्न देखें: Having Django serve downloadable files

एक दृश्य के माध्यम से फ़ाइलों को आसानी से सेवा करने के लिए (डीबग उद्देश्यों के लिए, उदाहरण के लिए) पढ़ना जारी रखें। कौन सा प्रदर्शन कर रहा है नहीं है कि तुम क्या जरूरत है, वेब सर्वर स्थिर फ़ाइल की सेवा, या `django.views.static.serve` http://127.0.0.1:8080/app/test-files/myxml/

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