如何从Django提供文本文件?

时间:2013-01-24 13:57:27

标签: django

我正在写一个基于Django的网站,但需要提供一个简单的文本文件。这是通过将它放在静态目录中并绕过Django的正确方法吗?

4 个答案:

答案 0 :(得分:35)

如果文件是静态的(不是由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

答案 1 :(得分:8)

我同意@luc,但另一种方法是使用X-Accel-Redirect标题。

想象一下,您必须提供大型受保护(必须登录才能查看)静态文件。如果您将文件放在静态目录中,那么它的访问权限是打开的,任何人都可以查看它。如果你通过打开文件然后提供它来在Django中提供它,那就有太多的IO而Django将使用更多的RAM,因为它必须将文件加载到RAM中。解决方案是有一个视图,它将根据数据库对用户进行身份验证,但是Django不会返回文件,而是会向其添加X-Accel-Redirect标头的响应。现在,由于Django落后于nginx,nginx将看到此标头,然后它将提供受保护的静态文件。这要好得多,因为与Django相比,nginx在提供静态文件方面要好得多。 Here是关于如何做到这一点的nginx文档。您也可以在Apache中执行类似的操作,但我不记得标题。

答案 2 :(得分: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')

渲染文本非常小,可以从模型中的其他字段动态生成。

答案 3 :(得分:1)

直到最近我才使用一种更复杂的方法,然后我发现了 thisthis

path('file.txt', TemplateView.as_view(template_name='file.txt',
                                      content_type='text/plain')),

然后将 file.txt 放在 Django 项目中 templates 目录的根目录中。

我现在将这种方法用于 robots.txt,一个类似于原始提问者的文本文件,以及一个预先生成的 sitemap.xml(例如,更改为 content_type='text/xml')。

除非我遗漏了什么,否则这非常简单而强大。

相关问题