2013-01-24 16 views
19

मैं एक Django आधारित वेबसाइट लिख रहा हूं, लेकिन एक साधारण पाठ फ़ाइल की सेवा करने की आवश्यकता है। क्या यह स्थिर निर्देशिका में डालने और Django को छोड़कर ऐसा करने का सही तरीका है?मैं Django से एक टेक्स्ट फ़ाइल कैसे सेवा करूं?

+0

हां, अगर फ़ाइल सादा पाठ (कोई गतिशील सामग्री नहीं है) यह सही है। –

उत्तर

26

यदि फ़ाइल स्थैतिक है (django ऐप द्वारा उत्पन्न नहीं) तो आप इसे स्थिर निर्देशिका में डाल सकते हैं।

यदि इस फ़ाइल की सामग्री Django द्वारा उत्पन्न की जाती है तो आप इसे text/plain के साथ mimetype के रूप में एक HttpResponse में वापस कर सकते हैं।

content = 'any string generated by django' 
return HttpResponse(content, content_type='text/plain') 

तुम भी प्रतिक्रिया की Content-Disposition की स्थापना करके फाइल करने के लिए एक नाम दे सकते हैं।

filename = "my-file.txt" 
content = 'any string generated by django' 
response = HttpResponse(content, content_type='text/plain') 
response['Content-Disposition'] = 'attachment; filename={0}'.format(filename) 
return response 
+2

['पीडीएफ फाइलों के लिए प्रलेखन में एक उदाहरण है] (https://docs.djangoproject.com/en/dev/howto/outputting-pdf/), जो दिखाता है कि एक Django पर एक गैर-HTML mimetype कैसे सेट करें' HttpResponse'। –

+0

सामग्री @luc से उत्पन्न फ़ाइल में एक विशिष्ट फ़ाइल नाम जोड़ना संभव होगा ?? – chuseuiti

+0

@chuseuiti हां, मैंने अपना जवाब अपडेट किया है – luc

6

मैं @luc से सहमत हैं, लेकिन एक और विकल्प X-Accel-Redirect शीर्ष लेख का उपयोग करने के लिए है।

कल्पना कीजिए कि आपको बड़ी सुरक्षित सेवा (इसे देखने के लिए लॉगिन करना है) स्थिर फाइलें हैं। यदि आप फ़ाइल को स्थिर निर्देशिका में डालते हैं, तो इसकी पहुंच खुली है और कोई भी इसे देख सकता है। यदि आप फ़ाइल खोलकर Django में इसकी सेवा करते हैं और फिर इसकी सेवा करते हैं, तो बहुत अधिक आईओ और Django अधिक RAM का उपयोग करेगा क्योंकि इसे फ़ाइल को रैम में लोड करना होगा। समाधान एक दृश्य है, जो एक डेटाबेस के खिलाफ उपयोगकर्ता को प्रमाणीकृत करेगा, हालांकि फ़ाइल लौटने की बजाय, Django X-Accel-Redirect हेडर को इसकी प्रतिक्रिया में जोड़ देगा। अब जब Django nginx के पीछे है, nginx इस हेडर को देखेगा और फिर यह संरक्षित स्थिर फ़ाइल की सेवा करेगा। यह बहुत बेहतर है क्योंकि Django से तुलनात्मक स्थिर फ़ाइलों की सेवा में nginx बहुत बेहतर और बहुत तेज़ है। Here nginx दस्तावेज़ हैं कि यह कैसे करें। आप अपाचे में भी इसी तरह की चीज कर सकते हैं, हालांकि मुझे हेडर याद नहीं है।

+0

दिलचस्प जवाब। धन्यवाद – luc

3

मुझे AJAX के माध्यम से फ़ॉर्म के लिए टेक्स्ट टेम्पलेट प्राप्त करने के लिए एक समान आवश्यकता थी। मैं इस तरह के मॉडल पर आधारित दृश्य (Django 1.6.1) के साथ इसे लागू करने के लिए चुन:

from django.http import HttpResponse 
from django.views.generic import View 
from django.views.generic.detail import SingleObjectMixin 

from .models import MyModel 

class TextFieldView(SingleObjectMixin, View): 
    model = MyModel 

    def get(self, request, *args, **kwargs): 
     myinstance = self.get_object() 
     content = myinstance.render_text_content() 
     return HttpResponse(content, content_type='text/plain; charset=utf8') 

गाया पाठ काफी छोटा और गतिशील मॉडल में अन्य क्षेत्रों से उत्पन्न है।

+0

विभिन्न फ़ाइल प्रकारों पर नियंत्रण रखने के लिए अच्छा समाधान और शानदार तरीका। क्या आपके पास इसका आह्वान करने के लिए 'url_patten' प्रविष्टि का एक उदाहरण है? – nehemiah

+0

मेरे पास यह url.py फाइलों में से एक में यह पैटर्न है: 'url (r '^ showfile/(? पी \ d +)/$', TextFieldView, name = 'showfile')' – jandd

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