我正在写一个基于Django的网站,但需要提供一个简单的文本文件。这是通过将它放在静态目录中并绕过Django的正确方法吗?
答案 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)