25

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

4

4 回答 4

46

如果文件是静态的(不是由 django 应用程序生成的),那么您可以将它放在静态目录中。

如果这个文件的内容是由 Django 生成的,那么你可以在 HttpResponse 中text/plain以 mimetype 的形式返回它。

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
于 2013-01-24T13:59:57.947 回答
9

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

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

于 2013-01-24T15:18:52.297 回答
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')

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

于 2013-12-28T23:55:00.983 回答
2

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

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

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

我现在将此方法用于robots.txt、原始询问者之类的文本文件和预生成的sitemap.xml(例如,更改为content_type='text/xml')。

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

于 2021-03-17T16:00:31.900 回答