我正在编写一个基于 Django 的网站,但需要提供一个简单的文本文件。通过将其放在静态目录中并绕过 Django 是正确的方法吗?
4 回答
如果文件是静态的(不是由 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
我同意@luc,但是另一种选择是使用X-Accel-Redirect
标题。
想象一下,您必须提供大型受保护(必须登录才能查看)静态文件。如果您将文件放在静态目录中,那么它的访问权限是开放的,任何人都可以查看它。如果您在 Django 中通过打开文件然后提供它来提供它,那么 IO 太多并且 Django 将使用更多 RAM,因为它必须将文件加载到 RAM 中。解决方案是有一个视图,它将根据数据库对用户进行身份验证,但是 Django 不会返回文件,而是将X-Accel-Redirect
标题添加到它的响应中。现在由于 Django 在 nginx 后面,nginx 将看到这个标头,然后它将为受保护的静态文件提供服务。这要好得多,因为与 Django 相比,nginx 在提供静态文件方面要好得多,速度也快得多。这里是关于如何做到这一点的 nginx 文档。你也可以在 Apache 中做类似的事情,但是我不记得标题了。
我对通过 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')
渲染的文本非常小,并且是从模型中的其他字段动态生成的。