2013-01-24 97 views
19

我正在寫一個基於Django的網站,但需要提供一個簡單的文本文件。把它放在靜態目錄並繞過Django是否正確的方法?如何從Django提供文本文件?

+0

是的,如果文件是純文本(沒有動態內容),它是正確的。 –

回答

26

如果文件是靜態的(不是由django應用程序生成的),那麼你可以把它放在靜態目錄中。

如果此文件的內容由Django生成,那麼您可以將它作爲mimetype與text/plain一起在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

['在PDF文件的文檔中有一個示例](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中提供它,那麼IO的數量太多,Django將使用更多的RAM,因爲它必須將文件加載到RAM中。解決方案是有一個視圖,它將根據數據庫對用戶進行身份驗證,但不是返回文件,Django會將X-Accel-Redirect標頭添加到其響應中。現在,由於Django在nginx的後面,nginx會看到這個頭文件,然後它會提供受保護的靜態文件。這要好得多,因爲與Django相比,nginx更好,更緊張地服務於靜態文件。 Here是關於如何做到這一點的nginx文檔。你也可以在Apache中做類似的事情,但是我不記得頭文件。

+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 /(?P \ d +)/ $',TextFieldView,name ='showfile')' – jandd