2013-01-24 82 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